我尝试过这个查询的不同变体,但是我无法让它使用时间戳索引。我做错了什么?
如有任何帮助,我们将不胜感激:)
MariaDB [alienvault]> explain extended SELECT * FROM alienvault_siem.acid_event WHERE (timestamp BETWEEN '2012-10-09 11:20:17' AND '2012-10-10 03:20:17');
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
| 1 | SIMPLE | acid_event | ALL | timestamp | NULL | NULL | NULL | 4481579 | 50.00 | Using where |
+------+-------------+------------+------+---------------+------+---------+------+---------+----------+-------------+
1 row in set, 1 warning (0.01 sec)表结构:
CREATE TABLE IF NOT EXISTS `acid_event` (
(...)
`timestamp` datetime NOT NULL,
(...)
PRIMARY KEY (`id`),
(...)
KEY `timestamp` (`timestamp`),
(...)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;软件: Percona Server
软件版本: 5.5.27-28.1 - Percona Server (GPL),第28.1版
发布于 2012-10-17 18:43:26
可能是由以下原因引起的:- index没有足够的选择性,而mysql认为全面扫描速度会更快- mysql的索引统计数据很差。
您可以检查“从alienvault_siem.acid_event中显示索引”的输出;您还可以尝试强制使用索引(但如果FROM扫描速度更快,则可能是不好的):
SELECT * FROM alienvault_siem.acid_event FORCE INDEX (`timestamp`) WHERE (timestamp BETWEEN '2012-10-09 11:20:17' AND '2012-10-10 03:20:17');发布于 2012-10-10 05:00:59
问题是,您将日期文本作为字符串提供。
如果您使用str_to_date()函数,如
WHERE timestamp
BETWEEN str_to_date('2012-10-09 11:20:17','%Y-%m-%d %H:%i:%s')
AND str_to_date('2012-10-10 03:20:17','%Y-%m-%d %H:%i:%s') 然后MySQL将能够使用该索引。
https://stackoverflow.com/questions/12811822
复制相似问题