【问题标题】:SELECT COUNT query matching 100 million rows from a 1 billion row table takes 30 seconds even with an indexSELECT COUNT 查询匹配 10 亿行表中的 1 亿行即使有索引也需要 30 秒
【发布时间】:2020-08-04 20:49:28
【问题描述】:

我试图了解 MySQL 中的索引以及它们如何工作以及它们在多大程度上提高了速度。我制作了一个包含 10 亿行的表,其中有一个名为“index_this”的列,其中包含 10 个可能的字符串值,大致均匀分布(因此每个值都在大约 1 亿行中找到)。这是我正在运行的查询。

SELECT COUNT(*) FROM mydatabase.mytable WHERE mytable.index_this = ‘A1ndxstring’;

运行此查询需要 30 秒,“index_this”列上有一个 BTREE 索引。我检查了查询优化器是否正在使用索引。

EXPLAIN SELECT COUNT(*) FROM mydatabase.mytable WHERE mytable.index_this = ‘A1ndxstring’;

返回

id              1
select_type     SIMPLE
table           mytable
type            ref
possible_keys   index_this
key             index_this
key_len         43
ref             const
rows            188130384
Extra           Using where; Using index

这是我创建索引的方式。

CREATE INDEX myindex ON mydatabase.mytable (index_this);

我没有指定前缀长度,但之前我确实尝试过使用 2 前缀长度,这使得查询花费了将近 100 倍的时间。 30 秒对于这个表大小和这个查询是否合理,即使有索引?我正在寻找有关如何提高速度的任何建议。提前致谢。

【问题讨论】:

  • 这是正确的索引。但是值很少,所以仍然需要计算大约 1 亿行。扔一些硬件怎么样?
  • 您需要的数字有多准确? EXPLAIN 输出是否足够?使用persistent stats 得到更好的估计吗?
  • 创建一个汇总表以保持运行总计,并为存储过程在每次插入时更新触发器,然后针对汇总表运行查询。
  • 30 秒对于那个音量来说已经相当不错了。
  • 拥有一个包含 10 亿个条目的表主要是由于糟糕的数据库设计

标签: mysql sql group-by query-optimization


【解决方案1】:

索引前缀很少有帮助;经常疼。

Using index 表示索引正在“覆盖”并被使用。也就是说,不需要接触数据。而且,考虑到查询,没有比这更好的了。

那么,为什么花了这么长时间?简单的。它必须遍历索引中约 188M 的“行”。那可能是一百万个索引块。每个块为 16KB。您的磁盘需要多长时间才能通过几个 GB?可能你所经历的 30 秒是现实的。即使所有这些块都缓存在 buffer_pool 中,也需要一些时间来遍历它们。

如果有 1000 个不同的值,那么优化器仍会选择相同的查询计划(“使用索引”)并以 100 倍的速度运行。时间与所触及的索引行数成正比。

基本上有两种方法可以运行查询——使用索引与表扫描。它选择了“正确”的那个。没有统计、分析等可以提供帮助。

如果您想描述真正的目标,也许有一种不同的技术可以提供帮助——例如“汇总表”。有多种方法可以更新统计信息。触发器、单独的更新、SP、每晚汇总等 - 选择取决于性能、限制、对最新值的需求等。(如果您想更深入地挖掘,请开始一个新问题。)

或者...您说大约有 10 个不同的值?然后更改为ENUM 会将列缩小为单个字节,并将索引缩小为两倍。如果它必须从磁盘读取索引,那么它的运行速度会提高一倍;如果它被完全缓存,那么加速会很小。

“扔硬件”不太可能有帮助。

  • CPU 速度——大约在 2000 年之前,CPU 变得越来越快。但从那以后,几乎没有什么变化。
  • 核心数 -- MySQL 不会为一个查询使用多个核心。 (8.0.17(?) 有 非常 少数情况下它会并行执行操作。我认为您的查询不在其中。)
  • RAM 速度 -- 另外,速度不是很快。
  • RAM 大小——如果索引缓存在缓冲池中而不是从磁盘中读取,则速度提升是显而易见的。 (我怀疑你现在有足够的 RAM。)
  • 磁盘速度 -- 过去几十年中磁盘读取速度的唯一大幅提升是从 HDD 到 SSD。但我的回答是假设您使用的是 SSD。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-21
    • 2012-11-30
    • 2013-08-10
    • 2018-06-01
    • 2012-10-13
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多