【问题标题】:(mysql query performance issues) Indexing of large historical share price database(mysql查询性能问题)大型历史股价数据库的索引
【发布时间】:2019-05-28 01:03:36
【问题描述】:

对于你们中的一些人来说,这可能是一个微不足道的问题,但我还没有找到/理解以下问题的解决方案:

我有一个大型 c 60 GB 数据库,其结构如下:

| Field      | Type     | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+-------+
| date       | datetime | YES  | MUL | NULL    |       |
| chgpct1d   | double   | YES  |     | NULL    |       |
| pair       | text     | YES  |     | NULL    |       |

数据库存储了过去 10 年中 200k 种不同配对交易的每日百分比变化。因此,日期和对都不是唯一键(日期+对的组合是)。有 c 2600 个不同的日期条目和 c 200k 个不同的对生成 > 520 MM 行。

以下查询需要 c 多分钟才能返回结果。

SELECT date, chgpct1d, pair FROM db WHERE date = '2018-12-20';

我可以做些什么来加快速度?

我已经阅读了多列索引,但我不确定这是否对我的情况有所帮助,因为所有 WHERE 查询都只会指向“日期”字段。

【问题讨论】:

    标签: mysql indexing database-design large-data query-performance


    【解决方案1】:

    MySQL 可能会进行全表扫描以满足您的查询。这就像在字典中查找一个单词,其条目是随机顺序的:非常慢。

    两件事:

    1. 在这些列上创建索引:(date, chgpct1d, pair)
    2. 因为名为@9​​87654322@ 的列具有DATETIME 数据类型,它可能包含2018-12-20 10:17:20 之类的值。当您说WHERE date = '2018-12-20' 时,它实际上意味着WHERE date = '2018-12-20 00:00:00'。所以,改用这个

      WHERE date >= '2018-12-20'
        AND date <  '2018-12-21`
      

    这将在您选择的日期随时捕获所有date 值。

    为什么会有帮助?因为您的多列索引以date 开头,MySQL 可以根据您拥有的 WHERE 语句对其进行范围扫描。而且,由于索引包含查询所需的所有内容,因此数据库服务器不必查看其他任何地方,而是可以直接从索引中满足查询。据说该索引覆盖查询。

    请注意,如果您的表中有半个 gigarow,创建索引将需要一段时间。在一夜之间完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 2016-11-19
      相关资源
      最近更新 更多