繁体   English   中英

简单的 SQL 查询不使用带有 order 子句和更大限制的索引 MariaDB

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

数据库:

  • 服务器版本:10.1.48-MariaDB-0+deb9u2 - Debian 9.13
  • 协议版本:10
  • 如果目标是获取任何一百万行,请省略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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM