【MySQL優化】避免索引失效的十個關鍵點,你都知道那些?

點擊查看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 wherename='kaka' orname='ka';
  • 然後給name創建索引
  • 上面這個語句會直接命中索引的
  • 假如說現在有多個條件的or
  • selectid,name,age from kaka wherename='kaka' orage=24;
  • 這個語句建立了name_age的索引,但是查詢字段有id會不走索引(這個就跟版本有關係了,在8.0是沒有一點問題的都會命中)
  • explain selectname,age from kaka wherename='kaka' orage=24;這個就會走索引

總結

  • 在查閱資料時切記自己實踐一下,有很多都是版本不一樣結果就不一樣
  • 還有更多的優化方案,我們後邊在慢慢補充
  • 讓我們一起寫好SQL
  • 讓程序飛起來

博主微信歡迎交流

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章