表:
CREATE TABLE `T1` ( `UserId` int(10) unsigned NOT NULL, `FriendUserId` int(10) unsigned NOT NULL, `IsDisplayed` tinyint(1) unsigned NOT NULL, `Created` datetime NOT NULL, KEY `FriendUserId` (`FriendUserId`,`IsDisplayed`,`UserId`,`Created`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
查询:
SELECT `UserId`, `FriendUserId`, UNIX_TIMESTAMP(`Created`) AS `Created` FROM `T1` WHERE `FriendUserId` = 22 AND `IsDisplayed` = 0 GROUP BY `UserId` ORDER BY `Created`
说明结果:
id: 1 select_type: SIMPLE table: T1 type: ref possible_keys: FriendUserId key: FriendUserId key_len: 5 ref: const,const rows: 1 Extra: Using where; Using index; Using temporary; Using filesort
问题:
我如何优化它,以便不使用临时表?
正如您可能理解的那样,问题在于按排序GROUP BY数据UserId,但结果集应按排序Created。因此,MySQL将输出放在一个临时表中,对其进行排序并进行输出。
GROUP BY
UserId
Created
技巧可能是强制Created一次按顺序输出不同的行。
我想到的第一个东西是这样的:
SELECT DISTINCT UserId, FriendUserId, UNIX_TIMESTAMP(`Created`) AS `Created` FROM T1 WHERE FriendUserId = 22 AND IsDisplayed = 0 ORDER BY `Created`
并将索引更改为(FriendUserId, IsDisplayed, Created, UserId)。
(FriendUserId, IsDisplayed, Created, UserId)
或另一个具有相同索引的查询:
SELECT UserId, FriendUserId, UNIX_TIMESTAMP(`Created`) AS `Created` FROM T1 WHERE FriendUserId = 22 AND IsDisplayed = 0 GROUP BY `Created`, UserId