场景:有150万至200万条记录的表
我需要执行一个删除旧记录的查询,条件中使用的唯一字段是日期。我已经为该字段添加了一个索引。
问题:查询执行时间太长(超过14分钟)。
这就是我迄今所做的
mysql> create index idx_logs_log_date ON logs (log_date);
Query OK, 0 rows affected (9.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> EXPLAIN SELECT * from logs where log_date < "2013-09-11";
| id | select_type | table | type | possible_keys | key | key_len | ref | row |Extra
+----+-------------+-------+------+-------------------+------+---------+------+-----+-----
| 1 | SIMPLE | logs | ALL | idx_logs_log_date | NULL | NULL | NULL | 1420480 | Using where |
1 row in set (0.00 sec)
mysql> delete from logs where log_date < "2013-09-11";
Query OK, 1163008 rows affected (14 min 20.87 sec)
我还尝试删除该索引,并在字段中添加一个键(当然这会创建一个新的索引),但是响应时间没有得到改善。
那么,我的问题是,对于如何提高响应时间,你还有其他的想法吗?
编辑:
mysql> SELECT COUNT(id) FROM logs WHERE log_date < "2013-09-14";
+-----------+
| COUNT(id) |
+-----------+
| 1182688 |
+-----------+
1 row in set (0.58 sec)
发布于 2013-11-11 21:11:15
最有可能的不是过滤器速度慢,而是删除行(通过测量执行SELECT COUNT(id) FROM logs WHERE log_date < "2013-09-14"
所需的时间来测试)。
为了加快速度,您需要调整一些服务器设置。但是,如果您只是将基于时间的日志保存在最后的X时刻,而不是希望查看基于日期的分区,那么您可以在不再需要时删除该表。
发布于 2013-11-11 22:09:03
由于SELECT count(*) from logs where log_date >= "2013-09-11";
返回253736,SELECT * from logs where log_date < "2013-09-11";
返回1163008,所以我推断索引实际上正在降低性能。
DROP INDEX `idx_logs_log_date` ON logs;
delete from logs where log_date < "2013-09-11";
create index idx_logs_log_date ON logs (log_date);
https://stackoverflow.com/questions/19921282
复制相似问题