我有以下查询:
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秒。
如何让这种运行更快的任何想法?
答案 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
索引,因为复合索引的前缀可用作索引。