【问题标题】:Adding index to optimize MySQL query添加索引以优化 MySQL 查询
【发布时间】:2023-03-15 23:01:01
【问题描述】:

我们有以下 MySQL 表,大约有 1.5 亿行:

CREATE TABLE `data` (
  `datetime` datetime NOT NULL,
  `value1` decimal(12,6) NOT NULL,
  `value2` decimal(12,6) NOT NULL,
  `value3` decimal(12,6) NOT NULL,
  `value4` decimal(12,6) NOT NULL,
  `value5` decimal(12,6) NOT NULL,
  `symbol_id` int(11) NOT NULL,
  PRIMARY KEY (`symbol_id`,`datetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

1.5 亿行平均分布在 9500 个符号之间,由 symbol_id 指定。

我正在尝试在表上运行以下查询:

SELECT datetime FROM data WHERE symbol_id = 1234 AND datetime <= "2013-03-01 15:00:00" ORDER BY datetime DESC LIMIT 1

对查询运行 EXPLAIN 会返回:

           id: 1
  select_type: SIMPLE
        table: data
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 12
          ref: NULL
         rows: 23856
        Extra: Using where; Using index

查询平均需要大约 300 毫秒才能运行。我可以添加什么索引来加快速度?

谢谢!

【问题讨论】:

  • 300 毫秒遍历 3.5 亿行是相当不错的。也许您需要考虑升级硬件以满足您的性能规格。
  • value 字段上也使用INDEX
  • 它实际上有 1.5 亿行,但问题是查询对某些符号运行得非常快,但不是全部......
  • 您现在拥有的似乎是此查询的最佳索引

标签: mysql optimization indexing


【解决方案1】:

此查询的性能可能会通过索引提高,但首先您必须确定列的基数。

SELECT COUNT(DISTINCT `datetime`) FROM `data`;
SELECT COUNT(DISTINCT `symbol_id`) FROM `data`;

返回最多的唯一值具有更高的基数并具有最佳复合索引,列必须按基数降序排列。

您当前有一个复合主键,其中的列按以下顺序排列。

PRIMARY KEY (`symbol_id`,`datetime`)

如果 symbol_id 具有比 datetime 更高的基数,则无法进一步优化查询。另一方面,如果 datetime 具有更高的基数,那么您应该添加一个 index,其中 datetime 后跟 symbol_id。

INDEX idx_datetime_symbol (`datetime`,`symbol_id`)

【讨论】:

    【解决方案2】:

    正如 Gordon 所暗示的,没有可以提高查询性能的索引。

    这并不是说您无法提高速度 - 调整您的 DBMS 和 OS I/O - 您没有提供任何关于它当前的配置方式、运行情况以及使用模式的信息喜欢。如果你还没有开始这个过程,那么对你的安装运行 mysqltuner.pl 将是一个好的开始——但它并不总是完全正确的。使用不同的引擎可能会提高此查询的性能 - 但这取决于您系统上发生的所有其他事情。

    通过将索引分片到多个磁盘和/或将 SSD 用于索引存储,您将获得巨大收益。更多的内存几乎总是有帮助的。

    转到get a good book 进行 MySQL 调优,花时间阅读它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多