[英]Simple SQL query not using index with order clause and larger limit MariaDB
我剛剛遇到數據庫在選擇大量數據時沒有考慮索引的問題。
這是一個簡單的 select 和 order 子句。
此查詢(或任何其他限制少於一百萬的查詢)
SELECT *
FROM mon_stat_detail
WHERE 1
ORDER BY id DESC
LIMIT 500000
正確使用列 id 上的索引(順便說一句。它不是主索引而是唯一索引)
雖然這個查詢
SELECT *
FROM mon_stat_detail
WHERE 1
ORDER BY id DESC
LIMIT 1000000
正在使用文件排序。
桌子很大,大約有 6000 萬。 記錄。
使用文件排序需要 15 分鍾,並且由於文件排序而在磁盤上創建超過 20GB 的數據
但是,如果我在同一個查詢上強制索引
SELECT *
FROM mon_stat_detail FORCE INDEX (id_2)
WHERE 1
ORDER BY id DESC
LIMIT 1000000
它正在使用它,並且只需要幾秒鍾的時間。
知道為什么會這樣嗎? 為什么我需要在這樣一個簡單的查詢上強制使用這個索引?
(精簡架構:)
CREATE TABLE mon_stat_detail (
id int(16) unsigned NOT NULL AUTO_INCREMENT,
sensor_id int(10) unsigned NOT NULL,
time datetime NOT NULL,
… other about 10 columns ...
PRIMARY KEY (sensor_id,time),
UNIQUE KEY id_2 (id),
… some more indexes and FK …
) ENGINE=InnoDB AUTO_INCREMENT=550579790 DEFAULT CHARSET=utf8
數據庫:
如果目標是獲取任何一百萬行,請省略ORDER BY
。
如果目標是獲取最后一百萬行並且id
中沒有間隙,則使用
WHERE id > (SELECT MAX(id) FROM mon_stat_detail) - 1000000 ORDER BY id ASC -- note; and no LIMIT is needed
如果可能存在差距,您可以查看運行此(在 Select 之前)是否有幫助:
ANALYZE TABLE mon_stat_detail;
對於 InnoDB,它速度很快,它會刷新查詢計划所基於的“統計信息”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.