【问题标题】:MySQL optimize query with Date rangeMySQL 使用日期范围优化查询
【发布时间】:2020-09-10 23:58:35
【问题描述】:

我有如下表结构。

id (INT) index
date (TIMESTAMP) index
companyId (INT) index

这是我面临的问题

companyId 111:在 1 年的时间段内总共有 100000 行。

companyId 222:在 1 年的时间段内共有 8000 行。

如果 companyId 111'2020-09-01 00:00:00' AND '2020-09-06 23:59:59' 之间有 100 行,而 companyId 222 在同一行中有 2000 行日期范围,companyId 111222 慢得多,即使它在所选日期范围内的行数较少。

MySQL 不应该忽略日期范围之外的所有行以使查询变得更快吗?

这是我正在使用的查询示例:

SELECT columns FROM table WHERE date BETWEEN '2020-09-01 00:00:00' AND '2020-09-06 23:59:59' AND companyId = 111;

谢谢

【问题讨论】:

  • 请发布 SHOW CREATE TABLE 表的 TEXT 结果;因此我们可以查看您是否在此时应用了任何建议。有人会帮助您获得高性能。
  • 您有时间发布 SHOW CREATE TABLE 表的当前 TEXT 结果吗?这样我们就可以看到你最终得到了一个带有索引的表吗?
  • 可以回复 - 不,我们会理解的。

标签: mysql select optimization


【解决方案1】:

我会在这里建议一个复合索引:

CREATE INDEX idx ON yourTable (companyId, date);

您的前提的问题是,虽然您在每一列上都有一个索引,但您没有任何索引完全覆盖示例查询的 WHERE 子句。因此,MySQL 甚至可能选择不使用您的任何索引。您也可以尝试颠倒上述索引的顺序来比较性能:

CREATE INDEX idx ON yourTable (date, companyId);

【讨论】:

  • 我应该创建这个新索引并保持其他索引不变,还是应该编辑/删除它们?
  • @CrashOverride - 请提供SHOW CREATE TABLE;我们无法猜测您还有哪些其他索引。一般来说,扔掉任何索引,它是另一个索引的 left 部分。
  • companyID first 因为它是用“=”测试的。那么索引的所有必要“行”都是连续的。
  • @RickJames 如果companyId 具有更高的基数,我也会建议第一个版本。
  • 基数相关。索引的结构是.
猜你喜欢
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
  • 2014-09-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2011-01-01
相关资源
最近更新 更多