百度提前批面經,抓住底層,一頓拷打
【寫在前面:求個小花花】
8. 索引失效場景
1. 索引列未使用或查詢條件與索引列不匹配
- 查詢的列未被索引:如果查詢的列沒有被索引,或者索引并未包含查詢的列,MySQL將不會使用索引進行查詢。
- 索引列未出現(xiàn)在查詢條件中:即使列被索引,但如果查詢條件中未使用該列,索引也不會被利用。
2. 索引列參與運算或函數(shù)處理
- 在索引列上使用函數(shù)或進行運算:這會導致MySQL無法使用索引,因為索引是基于列的原始值建立的,而函數(shù)或運算會改變這些值。
3. LIKE查詢以通配符開頭
- LIKE查詢且通配符(%)在字符串開頭:例如,
SELECT * FROM table WHERE column LIKE '%value'
。MySQL需要掃描整個索引來找到匹配項,因此索引失效。
4. 數(shù)據(jù)類型不匹配
- 查詢條件中的數(shù)據(jù)類型與索引列的數(shù)據(jù)類型不匹配:例如,如果索引列是整數(shù)類型,但查詢條件中使用了字符串類型進行比較,MySQL可能無法直接使用索引。
5. 索引列包含NULL值且查詢條件使用IS NULL或IS NOT NULL
- 對索引列使用IS NULL或IS NOT NULL:在某些情況下,MySQL可能無法有效地使用索引來優(yōu)化這類查詢。
6. 聯(lián)合索引未遵循最左前綴原則
- 在聯(lián)合索引中未使用最左邊的列作為查詢條件:例如,如果有一個(A, B, C)的聯(lián)合索引,但查詢條件是
WHERE B = 'value'
,則索引失效,因為最左前綴原則要求從索引的最左邊開始匹配。
7. 索引列參與范圍查詢且后續(xù)列未使用
- 在聯(lián)合索引中,一旦使用了范圍查詢(如>、<、BETWEEN等),后續(xù)列上的索引將失效:因為MySQL在索引中只會向右匹配到第一個范圍查詢條件。
8. 使用OR連接不同索引列
- 查詢條件中使用OR連接了多個索引列:如果OR連接的兩個條件分別涉及不同的索引列,MySQL可能無法有效使用索引,因為OR的含義是兩個條件中只要滿足一個即可,這可能導致全表掃描。
9. 使用不等于(!= 或 <>)比較
- 查詢條件中使用不等于比較:如果查詢條件中對索引列使用了不等于比較,且結果集較大時,索引可能會失效。
10. 使用NOT IN或NOT EXISTS
- 查詢條件中使用NOT IN或NOT EXISTS:這些操作可能導致索引失效,特別是當它們涉及普通索引而非主鍵索引時。
11. 索引統(tǒng)計信息不準確
- MySQL的索引統(tǒng)計信息過期或不準確:MySQL使用索引統(tǒng)計信息來估算查詢成本和選擇執(zhí)行計劃。如果統(tǒng)計信息不準確,MySQL可能會做出錯誤的決策,導致索引失效。
12. 索引選擇不當
- 為不適合索引的列創(chuàng)建了索引:例如,為數(shù)據(jù)離散度很低的列(如性別)創(chuàng)建索引,可能無法帶來性能提升,反而增加了存儲和維護索引的開銷。
13. 索引列過長
- 對過長的字符串列進行索引:這會導致索引占用大量存儲空間,并可能影響查詢性能。在這種情況下,考慮使用前綴索引可能是一個更好的選擇。
校招面經大全 文章被收錄于專欄
收錄各個網友分享的各個公司的面經,并給出答案。