點擊查看MySQL優化系列文章集錦,從頭到尾全部案例均配備源碼,讓你輕鬆看文章,輕鬆實踐
如你不想自己測試案例,可直接看優化總結,瞭解知識點即可
避免索引失效的十大關鍵點
最左側原則
- 比我們建立的一個索引ind_nax(name,age,sex)
- 那麼要想最好使用這個索引就必須select * from where name=‘咔咔’ and age=12 and sex = 1
- select * from where age=12 and sex = 1
- select * from where age=12
- select * from where sex = 1
- 以上三個語句都會導致索引失效
- 這就是最經典的帶頭大哥不能死
不在索引列上做任何操作(計算,函數,自動或者手動的類型轉換)都會導致索引失效,進行全表掃描
FROM_UNIXTIME這個函數就會導致索引失效,簡單的理解就是隻能是字段,其餘什麼都不能有
Db::query("select kaka,count(`ds_ip`) as ds_ip,FROM_UNIXTIME(`ds_time`,'%Y-%m-%d') as ds_time from table d where FROM_UNIXTIME(d.ds_time,'%Y-%m-%d')=? group by ds_domain_name",[$time]);
範圍條件之後的索引會失效
- create index ind_kaka_nas on kaka (
name
,age
,sex
); - 以上是我們建立的索引
- select * from kaka where name=‘kaka’ and age=24 and sex=1; 這種方式是全值匹配,三個const值,最好的使用
- explain select * from kaka where name=‘kaka’ and age>=24 and sex=1; 但是如果把age的條件改爲範圍的話,那麼sex這個索引的就失效,這個時候就只有name和age索引命中
打死都不用select * ,儘量使用覆蓋索引(就是隻查詢建立的索引的字段)。千萬不要懶,說過後在改,寫的時候就一次弄好
!=和<> 儘量不去使用,會直接導致索引失效
- 當然這個也不是絕對的哈
- 比如你的一張表裏就幾個配置項
- 比如說電影的分類
- 分類就電影,電視劇,綜藝 也就沒了
- 那麼我們技術需求的話是可以用的
- 大表的時候千萬不要用
- 規則是死了,人是活的嘛!沒有那麼絕對的,根據需求來
is null 和 is not null 對於這倆個暫時有點爭議,咔咔測試是可以被索引命中的。這個在開發過程中不太用。後期咔咔寫一篇文章對這個進行詳細剖析一下
子段類型是varchar,搜索時沒有帶引號會導致索引失敗
- 比如我們有個name字段
- name字段的數據類型是varchar
- 但是裏邊存了一個123
- 這個時候問題就來了
- 好多人寫這個sql就直接是 where name=123
- 這樣寫會直接導致索引失效的
- 正確的寫法是 where name = ‘123’
- 一定要把引號帶上
使用like查詢會導致索引失效(8.0會有驚喜哈)
- 這個like就有點意思了
- where like ‘%name’ 索引會失效
- where like ‘%name%’ 索引會失效
- where like ‘name%’ 這種纔會索引命中
- 關於網上資料說是創建覆蓋索引會命中索引
- 答案是可以的,但是跟數據庫版本是有關係的
- mysql5.5是不可以的,連同給name創建索引,但是查詢字段只有id都不會命中索引
- 但是在mysql8.0這個是可以的
- 所以網上資料時還是需要自己實操一下的
關於or
- 這個也跟版本的關係有點大
- 很多文章說改爲union
- 這個也是看需求吧!
- 比如我的字段裏邊有一個name字段和id字段
select id,
namefrom kaka where
name='kaka' or
name='ka';
- 然後給name創建索引
- 上面這個語句會直接命中索引的
- 假如說現在有多個條件的or
select
id,
name,age from kaka where
name='kaka' or
age=24;
- 這個語句建立了name_age的索引,但是查詢字段有id會不走索引(這個就跟版本有關係了,在8.0是沒有一點問題的都會命中)
explain select
name,age from kaka where
name='kaka' or
age=24;
這個就會走索引
總結
- 在查閱資料時切記自己實踐一下,有很多都是版本不一樣結果就不一樣
- 還有更多的優化方案,我們後邊在慢慢補充
- 讓我們一起寫好SQL
- 讓程序飛起來