[英]optimizing simple mysql query
I have a very simple query: 我有一个非常简单的查询:
SELECT cp.`id_connections`
FROM `connections_page` cp
WHERE cp.`time_end` IS NULL
AND TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 900
GROUP BY cp.`id_connections`
for a very simple table: 对于一个非常简单的表:
CREATE TABLE IF NOT EXISTS `ps_connections_page` (
`id_connections` int(10) unsigned NOT NULL,
`id_page` int(10) unsigned NOT NULL,
`time_start` datetime NOT NULL,
`time_end` datetime DEFAULT NULL,
PRIMARY KEY (`id_connections`,`id_page`,`time_start`),
KEY `time_end` (`time_end`),
KEY `id_connections` (`id_connections`),
KEY `id_page` (`id_page`),
KEY `time_start` (`time_start`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
with about 2.5 millions rows , and it takes between 2 and 6 seconds to execute (mysql 5.1.54-log) 大约有250万行 ,执行需要2到6秒 (mysql 5.1.54-log)
and EXPLAIN EXTENDED says: 和EXPLAIN EXTENDED说:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 SIMPLE cp ref time_end time_end 9 const 1497890 100.00 Using where; Using temporary; Using filesort
Looking at execution plan, there is something wrong with index usage, but I can't figure it out. 看看执行计划,索引使用有问题,但我无法弄清楚。 So: how can I do to speed up this query witohut changing data structure (I can change query and / or indexes, but not columns)? 那么:如何通过改变数据结构来加速这个查询(我可以更改查询和/或索引,但不能更改列)?
This part: 这部分:
TIME_TO_SEC(TIMEDIFF(NOW(), cp.`time_start`)) < 900
Cannot use the index on time_start
because the latter is part of the expression. 无法在time_start
上使用索引,因为后者是表达式的一部分。 If you want the query to be able to use that index, you'll need to rewrite it accordingly: 如果您希望查询能够使用该索引,则需要相应地重写它:
time_start < something_constant
Also, you might benefit by adding the index on several of the where/group by fields: 此外,您可以通过在几个where / group by字段中添加索引来获益:
key(time_start, time_end, id_connections)
first you don't need to use alias cp 首先你不需要使用别名cp
second I would try doing a sub select to reduce the time calculations 第二,我会尝试做一个子选择来减少时间计算
try this out let me know if it makes a difference 尝试这个让我知道它是否有所作为
SELECT id_connections
FROM (SELECT id_connections FROM connections_page WHERE time_end IS NULL))
WHERE TIME_TO_SEC(TIMEDIFF(NOW(), time_start)) < 900
GROUP BY id_connections
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.