索引失效問題是面試必問問題,因為索引失效的情況比較多,很多同學記不住,面試的時候回答不好。我仔細研究了七七四十七天,設計了一句七字口訣,記住這句口訣,以后再遇到這個問題就可以拿滿分了。
七字口訣就是:
模 型 數 空 運 最 快
口訣字面意思就是,要運送一個產品模型的話,要用空運,不要用陸運和海運,數空運最快。叫做:模型數空運最快。
下面我拆開逐字講解一下:
模:模糊查詢的意思。like的模糊查詢以%開頭,索引失效。比如:
SELECT * FROM `user` WHERE `name` LIKE '%老猿';
型:代表數據類型。類型錯誤,如字段類型為varchar,where條件用number,索引也會失效。比如:
SELECT * FROM `user` WHERE height= 180;
height為varchar類型導致索引失效。
數:是函數的意思。對索引的字段使用內部函數,索引也會失效。這種情況下應該建立基於函數的索引。比如:
SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03';
create_time字段設置索引,那就無法使用函數,否則索引失效。
空:是Null的意思。索引不存儲空值,如果不限制索引列是not null,數據庫會認為索引列有可能存在空值,所以不會按照索引進行計算。比如:
SELECT * FROM `user` WHERE address IS NULL --不走索引。 SELECT * FROM `user` WHERE address IS NOT NULL;--走索引。
建議大家這設計字段的時候,如果沒有必要的要求必須為NULL,那么最好給個默認值空字符串,這可以解決很多后續的麻煩(切記)。
運:是運算的意思。對索引列進行(+,-,*,/,!, !=, <>)等運算,會導致索引失效。比如:
SELECT * FROM `user` WHERE age - 1 = 20;
最:是最左原則。在復合索引中索引列的順序至關重要。如果不是按照索引的最左列開始查找,則無法使用索引。
快:全表掃描更快的意思。如果數據庫預計使用全表掃描要比使用索引快,則不使用索引。
這就是索引失效的七字口訣,請大家點贊之后默念三遍,模型數空運最快。
以上內容皆轉自 ‘老猿說開發’
