sql - MySQL 百万行查询速度

标签 sql mysql performance

我无法从一个大型 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) 创建的;

最佳答案

您需要在字段 typeplay_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/

相关文章:

MySQL - 使用基于子查询的计数器更新

sql - 进行条件聚合

mysql - ERROR 1114 表已满

mysql - 根据电子邮件地址映射两个mysql表

php - 在图像悬停和更新页面上查询 MySql DB 而不刷新

php - mysqli 使用 while 循环准备语句

javascript - Array.reduce的性能

performance - 基数排序的最佳基础

performance - 提高 FOR 循环的性能

php - 查询后反规范化表