(mysql查询性能问题)大型历史股价数据库索引

pvabu6sv  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(400)

对于你们中的一些人来说,这可能是一个微不足道的问题,但我还没有找到/理解解决以下问题的方法:
我有一个60 gb的大型数据库,其结构如下:

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

该数据库存储了过去10年中20万对不同交易的每日百分比变化。因此,date和pair都不是唯一的密钥(date+pair的组合是唯一的)。有c 2600个不同的日期条目和c 200k个不同的对,它们生成>520 mm的行。
下面的查询需要c几分钟才能返回结果。

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

我能做些什么来加快速度?
我读过关于多个列索引的文章,但我不确定这对我的情况是否有帮助,因为所有where查询都只指向“date”字段。

p1tboqfb

p1tboqfb1#

mysql可能会执行完整的表扫描来满足您的查询。这就好比在字典里查找词条顺序随机的单词:非常慢。
两件事:
在这些列上创建索引: (date, chgpct1d, pair) .
因为名为 dateDATETIME 数据类型,它可能包含如下值 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语句对其进行范围扫描。而且,因为索引包含查询所需的所有内容,所以数据库服务器不必查找其他任何地方,而是可以直接从索引满足查询。据说该索引覆盖了查询。
注意,表中有50亿行,创建索引需要一段时间。做个通宵什么的。

相关问题