【33期】分別談談聯(lián)合索引生效和失效的條件
閱讀本文大概需要 3.5 分鐘。
來自:https://blog.csdn.net/qq_35275233
聯(lián)合索引失效的條件
????create?table?myTest(
?????????a?int,
?????????b?int,
?????????c?int,
?????????KEY?a(a,b,c)
????);
select?*?from?myTest??where?a=3?and?b=5?and?c=4;?----??abc順序
select?*?from?myTest??where??c=4?and?b=6?and?a=3;
select?*?from?myTest??where?a=3?and?c=7;
select?*?from?myTest??where?a=3?and?b>7?and?c=3;?----?b范圍值,斷點,阻塞了c的索引
select?*?from?myTest??where?b=3?and?c=4;???---?聯(lián)合索引必須按照順序使用,并且需要全部使用
select?*?from?myTest??where?a>4?and?b=7?and?c=9;
select?*?from?myTest??where?a=3?order?by?b;
select?*?from?myTest??where?a=3?order?by?c;
select?*?from?mytable?where?b=3?order?by?a;
最后說說索引失效的條件
不在索引列上做任何操作(計算、函數(shù)、(自動or手動)類型轉換),會導致索引失效而轉向全表掃描
存儲引擎不能使用索引范圍條件右邊的列
盡量使用覆蓋索引(只訪問索引的查詢(索引列和查詢列一致)),減少select *
mysql在使用不等于(!=或者<>)的時候無法使用索引會導致全表掃描
is null,is not null也無法使用索引
like以通配符開頭(’%abc…’)mysql索引失效會變成全表掃描的操作。

SELECT?*?from?staffs?where?name='2000';??
--?因為mysql會在底層對其進行隱式的類型轉換
SELECT?*?from?staffs?where?name=2000;??
---?未使用索引
對于單鍵索引,盡量選擇針對當前query過濾性更好的索引
在選擇組合索引的時候,當前Query中過濾性最好的字段在索引字段順序中,位置越靠前越好。
在選擇組合索引的時候,盡量選擇可以能夠包含當前query中的where子句中更多字段的索引
盡可能通過分析統(tǒng)計信息和調整query的寫法來達到選擇合適索引的目的
推薦閱讀:
【32期】你知道Redis的字符串是怎么實現(xiàn)的嗎?
【31期】了解什么是 redis 的雪崩、穿透和擊穿?redis 崩潰之后會怎么樣?應對措施是什么
【31期】了解什么是 redis 的雪崩、穿透和擊穿?redis 崩潰之后會怎么樣?應對措施是什么
微信掃描二維碼,關注我的公眾號
朕已閱?
評論
圖片
表情

