Mysql
大表上的簡單 SELECT 查詢卡在“發送數據”狀態
我有一個大約 2 億行的表,如下所示:
id, name, timestamp, class
我在每一列都有一個索引,我正在嘗試執行這樣的查詢:
SELECT name FROM t WHERE timestamp >= date_x AND timestamp < date_y AND class='class_a'
此查詢僅使用 on
class
和 when的索引date_x
,date_y
大約一個月,部分 EXPLAIN 表示它查看了大約 1250 萬行,這比 on 的索引少timestamp
。當日期範圍很小時,這個查詢顯然會快速返回,但是隨著範圍的增加,這個查詢很快就會卡住,甚至永遠不會開始發送任何數據(即卡在 上
Sending data
),與簡單的SELECT * FROM t
which 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
輸出以顯示差異。