force index強制使用指定索引


問題:對於一個8000w數據量並有索引的表進行查詢,查詢了5分鍾才查詢出結果

產生問題的原因:索引失效。 數據表中數據量非常大,而查詢條件只有時間區間。(因為是>= 和 <= 無法使用索引

SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六 FROM 表一 INNER JOIN 表二 ON 關聯條件 INNER JOIN 表三 ON 關聯條件 INNER JOIN 表四 ON 關聯條件 WHERE 表一.created >= '2019-07-09 00:00:00' AND 表一.created <= '2019-07-30 23:59:59' ORDER BY 表一.created DESC

執行explain,發現該查詢檢索了全表8000w的數據。

如上圖索引失效,並未使用created字段作為查詢索引,而是一個聯合索引對查詢優化並無作用。 造成索引失效的原因有哪些,請看這表文章()

force index(表一_字段)
SELECT 字段一, 字段二, 字段三, 字段四, 字段五, 字段六
FROM 表一 force index(表一_字段) INNER JOIN 表二 ON 關聯條件 INNER JOIN 表三 ON 關聯條件 INNER JOIN 表四 ON 關聯條件 
WHERE 查詢條件一 AND 查詢條件二(表一.created >= '2019-07-09 00:00:00' AND 表一.created <= '2019-07-30 23:59:59') ORDER BY 表一.created DESC

添加了強制索引后再執行explain,這次只檢索了滿足查詢條件的110w條數據。

如圖,這次就使了created字段作為索引。查詢的數據量明顯減少,並且使用了created字段作為索引。

注意:mysql優化器會計算出一個合適的索引,但是這個索引不一定是最好的。force index()指令可以避免MySql優化器用到了一個低效的索引。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM