Le changement de commande par direction provoque un problème de performance
-
01-11-2019 - |
Question
J'utilise MySQL 5.6, et j'ai deux tables chacune avec des lignes de 16 m:
CREATE TABLE IF NOT EXISTS `newsstudios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16855382 ;
CREATE TABLE IF NOT EXISTS `newsstudio_categories` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`newsstudio_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `newsstudio_id` (`newsstudio_id`),
KEY `category_id` (`category_id`),
KEY `newsstudio_id_category_id` (`newsstudio_id`,`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=16864013 ;
J'ai une requête avec l'ordre par order by newsstudios.id ASC
:
SELECT SQL_NO_CACHE id FROM `newsstudios` WHERE exists
(
select newsstudio_id from newsstudio_categories
where newsstudios.id=newsstudio_categories.newsstudio_id
and newsstudio_categories.category_id in (1303,1313,1323,1333,1343,632)
)
order by newsstudios.id limit 5;
Le résultat de cette requête est:
+------+
| id |
+------+
| 27 |
| 47 |
| 87 |
| 110 |
| 181 |
+------+
5 rows in set (0.19 sec)
Mais quand je change la direction de l'ordre DESC
Le temps d'exécution de la requête diminue 100 fois:
+------+
| id |
+------+
| 98232|
| 98111|
| 95222|
| 88132|
| 78181|
+------+
5 rows in set (21 sec)
Premièrement: pourquoi cela change-t-il dans la direction de l'ordre en causant cette énorme différence de performance?
Deuxièmement: avant cette requête, j'ai essayé LEFT JOIN
et WHERE IN
requêtes au lieu de WHERE EXISTS
Mais ils ont un résultat en double que je devrais utiliser GROUP BY
que ça cause using filesort
et using temporary
ce qui diminue beaucoup les performances. Avez-vous des suggestions pour que la requête ait de meilleures performances?
Pas de solution correcte