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 是不會用到索引的呀,不知道索引類型是 FULL_TEXT 的是否能利用。
回答2:你這條語句查詢條件太復查,肯定是全表掃描,本人也不能寫出使用你這種情況的sql語句。建議,先將數據取出,再在 程序里做過濾
回答3:是否使用索引,mysql會感覺各個執行計劃的整體進行判定,不是說查詢條件中的字段有索引就一定會用。
具體到你提到的sql語句,需要針對數據和and的各個條進行分析,是否存在能夠大量過濾數據的條件(一般情況符合條件的記錄要小于表總記錄數的10%),然后針對這個條件的字段創建索引。
相關文章:
1. 如何解決docker宿主機無法訪問容器中的服務?2. springboot - spring-boot-starter-thymeleaf對沒有結束符的HTML5標簽解析出錯3. 正則表達式 - nginx 正則,如何匹配不以/結尾且不以.xml .html .htm結尾4. html - css布局問題,背景用用div畫的三角形是否用absolute與z-index來定位與規定在下方是否是個好方案5. 我 想好好學精通一門技術,大家用的走過的路,幫我指點指點唄 讓我少走了彎路和坑的苦 ,自學,自己摸6. javascript - 求助Angular 跨控制器調用方法可行嗎?7. 淺談vue生命周期共有幾個階段?分別是什么?8. index.php錯誤,求指點9. Android 高德地圖如何移除添加的某個marker?10. javascript - 函數聲明和匿名函數有什么不同?(前端小白求助。。)
