2015-07-28 2 views
-1

Quelqu'un peut-il régler cette requête pour de meilleures performances?Comment puis-je optimiser cette requête MySQL suivante

 
SELECT `Vocabulary`.`id`, 
`Vocabulary`.`title`, 
`Vocabulary`.`alias`, 
`Vocabulary`.`description`, 
`Vocabulary`.`required`, 
`Vocabulary`.`multiple`, 
`Vocabulary`.`tags`, 
`Vocabulary`.`plugin`, 
`Vocabulary`.`weight`, 
`Vocabulary`.`updated`, 
`Vocabulary`.`created`, 
`TypesVocabulary`.`id`, 
`TypesVocabulary`.`type_id`, 
`TypesVocabulary`.`vocabulary_id`, 
`TypesVocabulary`.`weight` 
FROM `epowerg`.`vocabularies` AS `Vocabulary` 
JOIN `epowerg`.`types_vocabularies` AS `TypesVocabulary` 
ON (`TypesVocabulary`.`type_id` IN (1, 2, 4) 
AND `TypesVocabulary`.`vocabulary_id` = `Vocabulary`.`id`)  
ORDER BY `Vocabulary`.`weight` ASC; 

Résultat généré par la requête:

 
+----+-------------+-----------------+------+---------------+------+---------+------+------+---------------------------------+ 
| id | select_type | table   | type | possible_keys | key | key_len | ref | rows | Extra       | 
+----+-------------+-----------------+------+---------------+------+---------+------+------+---------------------------------+ 
| 1 | SIMPLE  | Vocabulary  | ALL | PRIMARY  | NULL | NULL | NULL | 2 | Using temporary; Using filesort | 
| 1 | SIMPLE  | TypesVocabulary | ALL | NULL   | NULL | NULL | NULL | 4 | Using where; Using join buffer | 
+----+-------------+-----------------+------+---------------+------+---------+------+------+---------------------------------+ 

Merci à l'avance Prabhakaran. R

+0

Optimisation de quelle manière? Avez-vous des raisons de performance? –

+0

Ajouter un index à 'type_id' – Jens

+0

Pourquoi pensez-vous qu'il faut accorder? Ça semble bien. – tolanj

Répondre

3

Voici la structure de votre requête:

select v.*, tv.* 
from `epowerg`.`vocabularies` v JOIN 
    `epowerg`.`types_vocabularies` tv 
    ON tv.type_id IN (1, 2, 4) AND  
     tv.vocabulary_id = v.id  
ORDER BY v.weight ASC; 

Il existe essentiellement deux plans d'exécution possibles pour cette requête: lecture v première et à la recherche des valeurs dans tv. Ou lire tv et rechercher des valeurs dans v. Pour la première, vous voulez des index sur vocabularies(weight, id) et types_vocabularies(vocabulary_id, type_id). Si cela fonctionne, cela éliminera le tri.

La deuxième approche à essayer est le filtrage sur les types en premier. Les indices pour cela sont: types_vocabularies(type_id, vocabulary_id) et vocabularies(id).

La meilleure méthode dépend de la nature de vos données. Mais essayez le premier en premier, car éliminer le tri est souvent une bonne idée.