Requête SQL optimisation pour éviter table temporaire
La Table:
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;
La Requête:
SELECT `UserId`, `FriendUserId`, UNIX_TIMESTAMP(`Created`) AS `Created`
FROM `T1` WHERE `FriendUserId` = 22
AND `IsDisplayed` = 0
GROUP BY `UserId`
ORDER BY `Created`
EXPLIQUER résultat:
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
Question:
Comment l'optimiser afin qu'aucune table temporaire est utilisé?
OriginalL'auteur Roman Newaza | 2012-08-10
Vous devez vous connecter pour publier un commentaire.
Comme vous le comprenez sans doute, le problème est que
GROUP BY
les commandes données parUserId
, mais l'ensemble doit être ordonnée parCreated
; ainsi, MySQL met le résultat dans une table temporaire, les trie et les sorties.Le truc serait de forcer le outputing lignes distinctes dans le
Created
ordre à la fois.La première qui me vient à l'esprit est quelque chose comme ceci:
et de modifier l'index de
(FriendUserId, IsDisplayed, Created, UserId)
.Ou d'une autre requête avec le même index:
assurez-vous d'avoir le bon indice
OriginalL'auteur newtover
MySQL la documentation dit:
Donc, vous ne pouvez éviter d'utiliser une table temporaire, que par la suppression des
order by Created
OriginalL'auteur CyberDem0n