Mysql

大表上的簡單 SELECT 查詢卡在“發送數據”狀態

  • July 28, 2017

我有一個大約 2 億行的表,如下所示:

id, name, timestamp, class

我在每一列都有一個索引,我正在嘗試執行這樣的查詢:

SELECT name
FROM t
WHERE timestamp >= date_x AND
     timestamp < date_y AND
     class='class_a'

此查詢僅使用 onclass和 when的索引date_xdate_y大約一個月,部分 EXPLAIN 表示它查看了大約 1250 萬行,這比 on 的索引少timestamp

當日期範圍很小時,這個查詢顯然會快速返回,但是隨著範圍的增加,這個查詢很快就會卡住,甚至永遠不會開始發送任何數據(即卡在 上Sending data),與簡單的SELECT * FROM twhich in list 在和SHOW PROCESS之間交替相比。Sending data``Writing to net

我目前的解決方法是獲取每日範圍內的行,然後連接結果。一個月它應該返回大約 150 K 行,我認為這對於像這樣的直接查詢應該是可行的。這就是為什麼我認為應該有一種方法可以在沒有解決方法的情況下做到這一點。

我試過查看設置,但也沒有發現明顯的錯誤。我可以用相關的 MySQL 設置更新這個問題。

  • 我需要在class和上都有一個多列索引timestamp嗎?
  • 為什麼 MySQL 不能同時使用兩個索引來限制搜尋?
  • 我錯過了什麼嗎?

解釋輸出:

1   SIMPLE  table   ref index_class,index_timestamp index_class 302 const   11898928    100.00  Using where

我相信查詢優化器選擇的索引在一小段時間內是使用時間戳的索引,因此它更快。

我認為複合索引類,時間戳可以解決這個問題。

ps:可以在範圍小的時候放置查詢計劃嗎?

您的查詢沒有適當的索引(僅class使用簡單的索引),因此被迫獲取 11898928 行以應用時間戳限制。

添加多列索引(類、時間戳),您將看到會發生什麼。

請發布新的EXPLAIN輸出以顯示差異。

引用自:https://dba.stackexchange.com/questions/182074