【发布时间】:2014-08-22 10:22:04
【问题描述】:
我有一个表格,用于在 2 周内每 15 分钟存储约 35,000 件商品的价格。大约转换为表格中的大约 3500 万行。我正在尝试执行最简单的查询:
SELECT buy_price, sell_price, created_at FROM price_archive WHERE item_id = X
该查询的第一次未缓存运行大约需要 4-7 秒才能返回约 1300 行(每个项目)。对于数据库来说如此微不足道的事情,这似乎慢得离谱,尤其是考虑到item_id 列上有索引。
该表每 15 分钟插入 35k 行,并且每天运行一个任务以删除 created_at 上进行分区以删除旧数据是否会更好?
1306 rows in set (8.32 sec)
mysql> explain select * from price_archives where item_id = 743;
+----+-------------+----------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
| 1 | SIMPLE | price_archives | ref | index_price_archives_on_item_id | index_price_archives_on_item_id | 5 | const | 1305 | Using where |
+----+-------------+----------------+------+---------------------------------+---------------------------------+---------+-------+------+-------------+
【问题讨论】:
-
我建议您运行 OPTIMIZE 命令,然后运行上面的 SELECT 查询,看看它是否运行得更快。如果是,那么您知道碎片整理导致它变慢。此外,您当前使用的索引可能不是针对此特定查询最优化的索引。尝试使用 item_id、buyprice、sellprice、created_at 创建索引。
-
我不会运行优化并将表锁定到新的插入,而是克隆表,然后尝试相同的查询。