MySQL 1毫秒行查询速度

我无法从大型MySQL表中获得一个不错的查询时间,目前它耗时超过20秒.问题在于GROUP BY,因为MySQL需要运行一个文件排序,但我不知道如何解决这个问题

查询:

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

说明:

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

表结构

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 ;

如果有人知道如何提高速度我会非常感激

汤姆

编辑

我添加了新的索引只有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

该索引是使用ALTER TABLE log ADD INDEX(type,play_date)创建的;

最佳答案
您需要在字段类型AND play_date上创建索引.

像这样:

ALTER TABLE `log` ADD INDEX (`type`, `play_date`);

或者,您也可以重新排列最后一个键,如下所示:

KEY `type_2` (`type`,`play_date`,`timestamp`)

所以MySQL可以使用它的左侧部分作为密钥.

转载注明原文:MySQL 1毫秒行查询速度 - 代码日志