【发布时间】:2010-12-19 22:42:49
【问题描述】:
我真的很难缩短查询时间,它目前必须查询 250 万行并且需要 20 多秒
这里是查询
SELECT play_date AS date, COUNT(DISTINCT(email)) AS count
FROM log
WHERE play_date BETWEEN '2009-02-23' AND '2020-01-01'
AND type = 'play'
GROUP BY play_date
ORDER BY play_date desc;
`id` int(11) NOT NULL auto_increment,
`instance` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`type` enum('play','claim','friend','email') NOT NULL,
`result` enum('win','win-small','lose','none') NOT NULL,
`timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
`play_date` date NOT NULL,
`email_refer` varchar(255) NOT NULL,
`remote_addr` varchar(15) NOT NULL,
PRIMARY KEY (`id`),
KEY `email` (`email`),
KEY `result` (`result`),
KEY `timestamp` (`timestamp`),
KEY `email_refer` (`email_refer`),
KEY `type_2` (`type`,`timestamp`),
KEY `type_4` (`type`,`play_date`),
KEY `type_result` (`type`,`play_date`,`result`)
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE log ref type_2,type_4,type_result type_4 1 const 270404 Using where
查询正在使用 type_4 索引。
有谁知道如何加快这个查询速度?
谢谢 汤姆
【问题讨论】:
-
+1 用于提供所有相关信息和清晰的解释。
-
你能运行一个没有 COUNT 字段的函数来看看查询速度有多大变化吗?并不是说您不需要该字段,只是作为基准来了解它的影响有多大。
-
不计时间缩短了大约 8 秒
-
尝试按此顺序为 ("play_date", "email") 创建一个复合索引,如果使用它应该确实可以加快查询速度。
-
看起来像将电子邮件添加到 type_4 索引修复它
标签: mysql optimization