mysql索引的疑問
問題描述
explain select * from t_warning where FIND_IN_SET(’214’,t_wuserid) and FIND_IN_SET(’214_0’,t_wkstatus) and ((t_wstatus=2 and unix_timestamp(t_wstarttime)<=1485313428 and unix_timestamp(t_wendtime)>=1485313428) or t_wstatus=1 or (t_wstatus=3 and t_week=3)) and FIND_IN_SET(’2’,t_wtype) order by t_createtime desc limit 50;
這條語句牽扯到的 where 條件的字段都加上了索引,為什么索引還是沒有起作用?如何改sql?這條sql感覺寫的不好。
問題解答
回答1:FIND_IN_SET 是不會(huì)用到索引的呀,不知道索引類型是 FULL_TEXT 的是否能利用。
回答2:你這條語句查詢條件太復(fù)查,肯定是全表掃描,本人也不能寫出使用你這種情況的sql語句。建議,先將數(shù)據(jù)取出,再在 程序里做過濾
回答3:是否使用索引,mysql會(huì)感覺各個(gè)執(zhí)行計(jì)劃的整體進(jìn)行判定,不是說查詢條件中的字段有索引就一定會(huì)用。
具體到你提到的sql語句,需要針對數(shù)據(jù)和and的各個(gè)條進(jìn)行分析,是否存在能夠大量過濾數(shù)據(jù)的條件(一般情況符合條件的記錄要小于表總記錄數(shù)的10%),然后針對這個(gè)條件的字段創(chuàng)建索引。
相關(guān)文章:
1. 我的html頁面一提交,網(wǎng)頁便顯示出了我的php代碼,求問是什么原因?2. 我在centos容器里安裝docker,也就是在容器里安裝容器,報(bào)錯(cuò)了?3. 數(shù)據(jù)庫 - 使用讀寫分離后, MySQL主從復(fù)制延遲會(huì)導(dǎo)致讀不到數(shù)據(jù)嗎?4. tp6表單令牌5. docker 17.03 怎么配置 registry mirror ?6. 老哥們求助啊7. django - 后臺(tái)返回的json數(shù)據(jù)經(jīng)過Base64加密,獲取時(shí)用python如何解密~!8. node.js - node 客戶端socket一直報(bào)錯(cuò)Error: read ECONNRESET,用php的socket沒問題哈。。9. 如何解決docker宿主機(jī)無法訪問容器中的服務(wù)?10. javascript - canvas 可以實(shí)現(xiàn) PS 魔法橡皮擦的功能嗎?
