我有一个包含 6000 万条条目的数据库。
每个条目包含:
-
我需要选择特定月份的条目。每个月包含大约 200 万个条目。
select *
from Entries
where time between "2010-04-01 00:00:00" and "2010-05-01 00:00:00"
(查询时间约1.5分钟)
我还想从给定的 DataSourceID 中选择特定月份的数据。
(大约需要20秒)
大约有 50-100 个不同的 DataSourceID。
有没有办法让它更快?我有什么选择?
如何优化这个数据库/查询?
EDIT:有大约。每秒 60-100 次插入!
要更快地获取特定月份、特定年份的条目 - 您将需要索引time column:
CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;
另外,使用:
SELECT e.*
FROM ENTRIES e
WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)
...因为 BETWEEN 是包容性的,所以您会在您发布的查询中得到日期为“2010-05-01 00:00:00”的任何内容。
我还想从给定的 DataSourceID 中选择特定月份的数据
您可以为 datasourceid 列添加单独的索引:
CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;
...或设置覆盖索引以包含两列:
CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;
覆盖索引要求在查询中必须使用最左边的列才能使用索引。在这个例子中,有time
首先适用于您提到的两种情况 - datasourceid 不必用于索引即可使用。但是,您必须通过查看 EXPLAIN 输出来测试您的查询,以真正了解什么最适合您的数据以及对该数据执行的查询。
也就是说,索引会减慢 INSERT、UPDATE 和 DELETE 语句的速度。如果列数据具有很少的不同值,则索引不会提供很多价值 - 即:布尔列是索引的糟糕选择,因为基数很低。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)