我是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秒,我就没事了。
答案 0 :(得分:1)
要获得最有效的查询,您需要查询聚簇索引。根据{{3}},它会自动设置在主键上,不能在任何其他列上设置。
我建议放弃date
列并在time
和instrument
上创建复合主键
答案 1 :(得分:0)
一些建议:
date
的时间,则无需单独存储日期和时间。您可以使用一个datetime
列并在其中存储时间戳datetime
和instrument
列上设置一个索引,以便让查询更快地运行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
列。注意:此模式适用于DATE
,DATETIME
,DATETIME(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
是数据的最大驱动因素。