1献幔、 最好全值匹配——索引怎么建我怎么用。
分析
三次查詢均使用到索引览芳。
2斜姥、 最佳左前綴法則——如果索引了多列,要遵守最左前綴法則沧竟。指的是查詢要從索引的最左前列開始并且不跳過索引中的列铸敏。
分析:
- 前提條件: 表中已添加復(fù)合索引name,age悟泵,pos
- 第一次執(zhí)行缺少name杈笔,查詢條件復(fù)合索引最左側(cè)name缺少,違反了最佳左前綴法則糕非,導(dǎo)致索引失效蒙具,變?yōu)锳LL,全表掃描。
- 同理朽肥,第二次查詢條件中只有pos禁筏,違反了最佳左前綴法則,導(dǎo)致索引失效衡招,變?yōu)锳LL,全表掃描篱昔。
- 第三次查詢中存在name,索引能夠被使用到,但是是部分使用州刽。
3空执、不在索引列上做任何操作(計算,函數(shù)穗椅,(自動或者手動)類型裝換)辨绊,會導(dǎo)致索引失效而導(dǎo)致全表掃描∑ケ恚——MYSQL自帶api函數(shù)操作门坷,如:left等
分析:
- 沒有使用函數(shù)時,索引被使用到袍镀。
- 當(dāng)用函數(shù)操作加的索引列時拜鹤,索引將會失效,變成了全表掃描流椒。
4、存儲引擎不能使用索引中范圍條件右邊的列明也⌒海——范圍之后索引失效。(< ,> between and,)
分析:
- 執(zhí)行查詢一時温数,索引全部使用到绣硝。
- 執(zhí)行查詢二時,索引使用到name和age撑刺,但是name是使用索引檢索鹉胖,而age著重索引排序,這時age為范圍查找够傍,pos索引將失效
5甫菠、盡量使用覆蓋索引(只訪問索引的查詢(索引和查詢列一致)),減少select*冕屯〖庞眨——按需取數(shù)據(jù)用多少取多少。
6安聘、在MYSQL使用不等于(<,>,!=)的時候無法使用索引痰洒,會導(dǎo)致索引失效。
7浴韭、is null或者is not null 也會導(dǎo)致無法使用索引丘喻。
8、like以通配符開頭('%abc...')MYSQL索引失效會變成全表掃描的操作念颈∪郏——覆蓋索引。
分析:
- 兩邊均有%時和左邊有%時舍肠,索引會失效搀继,而%在右邊時窘面,索引可用。
-
解決like'%字符串%'時索引不被使用的方法:添加覆蓋索引叽躯。
在name和age上添加索引财边,查詢,索引被使用点骑。這樣酣难,單獨查詢name和單獨查詢age時都會使用到索引。
email沒有加索引黑滴,這樣like后憨募,這樣就會變成全表掃描。