我无法从一个大型 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
) 创建的;
最佳答案
您需要在字段 type
和 play_date
上创建索引。
像这样:
ALTER TABLE `log` ADD INDEX (`type`, `play_date`);
或者,您也可以像这样重新排列最后一个键:
KEY `type_2` (`type`,`play_date`,`timestamp`)
因此 MySQL 可以将其左侧部分用作键。
关于sql - MySQL 百万行查询速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136930/