mysql的組合索引

吐司波妞發表於2024-07-26

建立聯合索引

修改表-建立索引
image
建立表-建立索引
image

建立結果:

Seq_in_index:表示該列在索引中的位置,如果索引是單列的,則該列的值為 1;如果索引是組合索引,則該列的值為每列在索引定義中的順序。
這裡decie_id在組合索引中的順序是1,question_id在組合索引中的順序是2
列在組合索引的順序主要影響在排序和查詢條件中

使用組合索引

where子句使用組合索引

where條件中索引列交換位置不會影響查詢
2個條件都使用上,最佳化器可以自己調整順序滿足索引要求
image
image
根據最左原則,where條件只用了decie_id,組合索引不會失效
image
根據最左原則,where條件只用了question_id,組合索引失效
image

order語句使用組合索引

最佳化器預設採取全部掃描了,因為是查詢出所有資料,所以全表掃描會比索引更快,節省回表的時間,排序使用的是檔案排序
image
如果是篩選部分資料,那麼就會使用到索引而不會全表掃描;排序使用的是索引欄位
image
調整orderby欄位的順序之後,索引失效;所以當使用order by語句,確保與聯合索引的順序要一致
image
索引覆蓋
image

where和order子句中使用組合索引

where條件只有where條件只用了decie_id,根據最左原則索引生效;實際只用了decie_id索引,order by使用索引生效
image
where條件只有where條件只用了decie_id,根據最左原則索引生效;但是decie_id使用>範圍查詢後,導致資料亂序,實際只用了decie_id索引;排序是透過索引question_id排序的
image

組合索引失效

where條件中有>=導致組合索引失效
image
最左原則匹配失敗,組合索引失效
image

參考:https://mp.weixin.qq.com/s?__biz=MzI2NzM1OTM4OA==&mid=2247495940&idx=1&sn=a229b322b7caa51a3b3c53466e22bfd8&chksm=ea82b4f7ddf53de196cee2bafbfa44f7cc2c0e5b0f74cdac91e7a5d6c611b3ecefc5df0d8332&scene=27

相關文章