Tom*_*Tom 4 mysql sql performance
我无法从大型MySQL表中获得一个不错的查询时间,目前它耗时超过20秒.问题在于GROUP BY,因为MySQL需要运行一个文件排序,但我不知道如何解决这个问题
QUERY:
SELECT play_date, COUNT(DISTINCT(email)) AS count
FROM log
WHERE type = 'play'
AND play_date BETWEEN '2009-02-23'
AND '2009-02-24'
GROUP BY play_date
ORDER BY play_date desc
Run Code Online (Sandbox Code Playgroud)
说明:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE log ALL type,type_2 NULL NULL NULL 530892 Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
表结构
CREATE TABLE IF NOT EXISTS `log` (
`id` int(11) NOT NULL auto_increment,
`email` varchar(255) NOT NULL,
`type` enum('played','reg','friend') 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 `type` (`type`),
KEY `email_refer` (`email_refer`),
KEY `type_2` (`type`,`timestamp`,`play_date`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=707859 ;
Run Code Online (Sandbox Code Playgroud)
如果有人知道如何提高速度我会非常感激
汤姆
编辑
我添加了新的索引只有play_date和类型,但MySQL拒绝使用它
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE log ALL play_date NULL NULL NULL 801647 Using where; Using filesort
Run Code Online (Sandbox Code Playgroud)
该索引是使用ALTER TABLE logADD INDEX(type,play_date)创建的;
Kur*_*aze 11
您需要在字段typeAND 上创建索引play_date.
像这样:
ALTER TABLE `log` ADD INDEX (`type`, `play_date`);
Run Code Online (Sandbox Code Playgroud)
或者,您也可以重新排列最后一个键,如下所示:
KEY `type_2` (`type`,`play_date`,`timestamp`)
Run Code Online (Sandbox Code Playgroud)
所以MySQL可以使用它的左侧部分作为密钥.