[英]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.