🌈鍵盤敲爛,年薪30萬🌈
目錄
一、索引失效
📕最左前綴法則
📕范圍查詢>
📕索引列運算,索引失效
📕前模糊匹配
📕or連接的條件
📕字符串類型不加 ''?
📕數據分布
📕is not null
二、SQL提示:
①建議索引
②強制索引
③忽略索引
三、覆蓋索引
四、前綴索引?
一、索引失效
📕最左前綴法則
規則:
- 最左側的列必須存在,如果不存在,索引失效,和位置無關!!!
- 從索引的最左側開始,不能跳躍某一索引列,如果跳過某一列,那么后面的索引都會失效。
例如:
- 有聯合索引 id_name_age_gender (name字段為最左列)
遵循法則:select * from user where name = 'zhang' and age = 12 and gender = 1;
遵循法則:select * from user where age = 10 and name = 'zhang';
不遵循法則:select * from user where age = 10 and gender = 1;
📕范圍查詢>
范圍查詢右側的列索引失效
例如: > < 號會使索引失效
select * from user where age > 10;
?故:
盡量使用 >= 或者 <=
📕索引列運算,索引失效
對索引列進行運算,索引失效,因為運算完之后新的數據不具有索引結構
select * from user where substring(name, 0 ,2) = 'zh';
?
📕前模糊匹配
%在最左側索引失效
索引失效:select * from user where name like '%hang';
索引不失效:select * from user where name like 'zhan%';
📕or連接的條件
使用or連接的字段索引都會失效
select * from user where id = 1 or name = 'zhang';
📕字符串類型不加 ''?
如果數據庫字段類型為varchar 但是查詢每加'',索引失效
select * from user where name = zhang;
📕數據分布
如果MySQL經過判斷之后發現全表掃描比按索引查詢快,就會走全表掃描
📕is not null
如果一列數據基本沒有null,is not null就會使索引失效
二、SQL提示:
例如:有兩個索引 id_name_age? ?id_name
執行:select * from user where name = 'zhang';
會走哪個索引呢?
- 這時mysql經過優化后會選擇一個索引,但是性能不一定最佳,因此可以指定索引。
①建議索引
select * from user use index(id_name) where name = 'zhang';
注意:提出的建議,mysql不一定聽。?
②強制索引
select * from user force index(id_name) where name = 'zhang';
③忽略索引
selct * from user ignore index(id_name_age) where name = 'zhang';
三、覆蓋索引
查詢使用了索引,并且查詢的字段 (select 后面的字段) 在該索引中可以全部找到。
例如:
- 回表查詢
故:
盡量避免使用select * ,這很容易導致回表查詢。
四、前綴索引?
可以將字符串的一部分抽取出來作為前綴創建索引
例如:選取前4個字符作為name字段的索引
create index id_name on user(name(4));