使用GROUP BY时查询速度慢

时间:2014-10-23 07:33:00

标签: mysql performance group-by

我有以下查询:

SELECT id, user_id, cookieId, text_date 
FROM `_history` 
WHERE text_date BETWEEN '2014-09-01' AND '2014-10-01' AND user_id = 1 
GROUP BY cookieId 
ORDER BY id DESC

我的表架构:

CREATE TABLE `_history` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `cookieId` varchar(50) NOT NULL,
  `text_from` varchar(50) NOT NULL,
  `text_body` text NOT NULL,
  `text_date` datetime NOT NULL,
  `aName` varchar(50) NOT NULL,
  `hasArrived` enum('0','1') NOT NULL COMMENT,
  `agent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cookieId` (`cookieId`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

EXPLAN产生了这个:

1   SIMPLE  _history    ref cookieId,user_id    user_id 4   const   49837   Using where; Using temporary; Using filesort

有时查询需要2秒,有时最多需要5秒。

如何让这种运行更快的任何想法?

2 个答案:

答案 0 :(得分:1)

该小组目前什么都不做,所以放弃它。

user_id上已有索引,因此查询和排序就可以了。

text_date上没有索引,在其上添加索引可以加快查询速度。

如果经常发生此查询,请在user_id和text_date上添加复合索引。

例如。

create index idx_text_date on `_history` (text_date);

根据评论,查询应如下所示:

SELECT cookieId, max(id), max(user_id), max(text_date)
FROM `_history` 
WHERE text_date BETWEEN '2014-09-01' AND '2014-10-01' 
AND user_id = 1 
GROUP BY cookieId 
ORDER BY id DESC

索引应如下所示:

create index idx__history_text_date_cookieId on `_history` (text_date, cookieId);

答案 1 :(得分:0)

(user_id, cookieId)上创建综合索引。

CREATE TABLE `_history` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `cookieId` varchar(50) NOT NULL,
  `text_from` varchar(50) NOT NULL,
  `text_body` text NOT NULL,
  `text_date` datetime NOT NULL,
  `aName` varchar(50) NOT NULL,
  `hasArrived` enum('0','1') NOT NULL COMMENT,
  `agent_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `cookieId` (`cookieId`),
  KEY `user_id_X_cookieId` (`user_id`, `cookieId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

然后它将能够使用user_id索引来查找行,并使用该索引的cookieId后缀对它们进行分组。

如果有此索引,则不需要user_id索引,因为复合索引的前缀可用作索引。