問題:對於一個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優化器用到了一個低效的索引。