在MySql中,是否值得在同一组列上创建多个多列索引?

时间:2017-09-08 08:32:45

标签: mysql sql indexing

我是SQL的新手,当然是MySQL的新手。 我已经根据名为trade的流媒体市场数据创建了一个表格,看起来像

 date     | time                  |instrument|price  |quantity
----------|-----------------------|----------|-------|--------
2017-09-08|2017-09-08 13:16:30.919|12899586  |54.15  |8000     
2017-09-08|2017-09-08 13:16:30.919|13793026  |1177.75|750      
2017-09-08|2017-09-08 13:16:30.919|1346049   |1690.8 |1         
2017-09-08|2017-09-08 13:16:30.919|261889    |110.85 |50       

此表非常庞大(每个日期1.5亿行)。 为了有效地检索数据,我创建了一个索引date_time_inst (date,time,instrument),因为我的大多数查询都会选择一个特定的日期 或日期范围,然后是时间范围。 但这无助于加速查询,如:

select * from trade where date="2017-09-08", instrument=261889

所以,我正在考虑创建另一个索引date_inst_time (date, instrument, time)。这有助于加快查询,我希望获得数千个中的一个或几个乐器的时间序列吗? 由于索引更新导致额外的数据库写入时间,我应该过分担心吗?

我每秒都获取数据,并花费大约100毫秒来处理它并存储在数据库中。只要我继续服用不到1秒,我就没事了。

5 个答案:

答案 0 :(得分:1)

要获得最有效的查询,您需要查询聚簇索引。根据{{​​3}},它会自动设置在主键上,不能在任何其他列上设置。

我建议放弃date列并在timeinstrument上创建复合主键

答案 1 :(得分:0)

一些建议:

  • 如果时间对应于同一date的时间,则无需单独存储日期和时间。您可以使用一个datetime列并在其中存储时间戳
  • 然后,您可以在datetimeinstrument列上设置一个索引,以便让查询更快地运行
  • 由于SELECT查询的插入次数和固定格式如此之多(即始终按date,然后是instrument),我建议您查看其他列式数据库(如Cassandra)。您将获得更快的写入和读取此类结构

答案 2 :(得分:0)

首先,您的用例听起来像两个索引有用(date, instrument)(date, time)

考虑到您的数据量,您可能需要考虑对数据进行分区。这涉及将不同的“分片”数据存储在不同的文件中。一个开始的地方是documentation

根据您的说明,您可能希望按date进行分区,但instrument是另一个候选人。

另一种方法是使用date作为索引中第一列的聚簇索引。这假设数据是“按顺序”插入的,以减少插入数据的移动。

您正在处理大量数据。 MySQL应该能够处理卷。但是,您可能需要深入了解更高级的功能,例如分区和聚簇索引,以获得所需的功能。

答案 3 :(得分:0)

<强>错字吗

我认为你的意思是

select * from trade where date="2017-09-08" AND instrument=261889
                                            ^^^

最佳指数就是

INDEX(instrument, date)

而且,与其他评论/答案相反,最好让date 最后,特别是如果你想要超过一天。

分割日期和时间

分割日期和时间通常是个坏主意。拥有冗余数据通常也是一个坏主意;在这种情况下,重复日期。相反,使用

WHERE `time` >= "2017-09-08"
  AND `time`  < "2017-09-08" + INTERVAL 1 DAY

并删除date列。注意:此模式适用于DATEDATETIMEDATETIME(3)等,而不会影响范围结束时的午夜。

数据量?

150M行?每秒10个新行?这意味着你有大约5年的时间。数据?稳定的10 /秒插入率几乎不是问题。

需要查看SHOW CREATE TABLE。如果有很多索引,那么可能会出现问题。需要查看数据类型以查找缩小的大小。

你会被清洗掉吗?数据?如果是这样,我们需要谈谈为特定目的进行分区。

有多少&#34;乐器&#34;?内存多少钱?需要与instrument讨论索引开始的后果。

查询

这是您使用的主要SELECT吗?总是1天吗?一个乐器?通常会返回多少行。

取决于PRIMARY KEY和所使用的索引,获取100行可能需要10毫秒到1000毫秒。这个问题很重要吗?

毫秒分辨率

通常认为任何时间分辨率不会重复。

是否已有AUTO_INCREMENT

答案 4 :(得分:0)

空间很便宜。索引需要时间创建/插入(一次),但是剃须时间检索(很多次)

我的经验是在所有订单中创建所有相关字段的索引。这样,Mysql可以为您的查询选择最佳索引。

所以如果你有3个相关领域

INDEX 1 (field1,field2,field3)
INDEX 2 (field1,field3)
INDEX 3 (field2,field3)
INDEX 4 (field3)

当所有字段都存在时,将使用第一个索引。其他的是更短的WHERE条件。

除非您知道某些组合永远不会被使用,否则这将为MySQL提供优化查询的最佳机会。我还假设field1是数据的最大驱动因素。

相关问题