对于你们中的一些人来说,这可能是一个微不足道的问题,但我还没有找到/理解解决以下问题的方法:
我有一个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”字段。
1条答案
按热度按时间p1tboqfb1#
mysql可能会执行完整的表扫描来满足您的查询。这就好比在字典里查找词条顺序随机的单词:非常慢。
两件事:
在这些列上创建索引:
(date, chgpct1d, pair)
.因为名为
date
有DATETIME
数据类型,它可能包含如下值2018-12-20 10:17:20
. 当你说WHERE date = '2018-12-20'
它实际上意味着WHERE date = '2018-12-20 00:00:00'
. 所以,用这个代替它将捕获所有
date
在您选择的日期的任何时间的值。为什么这样有帮助?因为你的多列索引以
date
,mysql可以根据where语句对其进行范围扫描。而且,因为索引包含查询所需的所有内容,所以数据库服务器不必查找其他任何地方,而是可以直接从索引满足查询。据说该索引覆盖了查询。注意,表中有50亿行,创建索引需要一段时间。做个通宵什么的。