我在MySQL(InnoDB)中有一个大表,我遇到了一些性能问题。
这是我的结构:
id UNSIGNED INT (PK)
tag_id INTEGER (FK to tags)
value FLOAT
datetime DATETIME
UNIQUE INDEX (tag_id, value, datetime)
我每5分钟插入3000行。此刻我有12,7GB的信息。
我希望用户看到包含下一个查询或类似内容的图表:
SELECT tags.name, value, datetime
FROM values
INNER JOIN tags ON tag_id = tags.id
WHERE
datetime BETWEEN '2015-01-01' AND '2015-06-30'
AND tag_id = 25
ORDER BY datetime ASC
好吧,有时这个查询很快(不到一秒钟),有时需要一分多钟。
它在运行最新版MySQL社区的Windows上运行。 计算机有8GB的RAM,我改变了这个配置:
innodb_buffer_pool_size=3G
innodb_log_file_size=48M
innodb_log_buffer_size=16M
我做错了什么?
答案 0 :(得分:1)
对于那个SELECT
的表现:
INDEX(tag_id, datetime) -- in this order
有关进一步的讨论,请参阅my blog。
推荐
WHERE `datetime` >= '2015-01-01'
AND `datetime` < '2015-01-01' + INTERVAL 6 MONTH
1月1日和6月30日的大部分时间都没有。