我该如何优化以下mysql查询

时间:2015-07-28 11:50:06

标签: mysql sqlperformance

有人可以调整此查询以获得更好的性能吗?

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;

从查询生成的结果:

+----+-------------+-----------------+------+---------------+------+---------+------+------+---------------------------------+
| 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  |
+----+-------------+-----------------+------+---------------+------+---------+------+------+---------------------------------+

提前致谢 普拉巴卡兰。 [R

1 个答案:

答案 0 :(得分:3)

以下是您的查询结构:

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; 

此查询基本上有两种可能的执行计划:首先阅读v并在tv中查找值。或者阅读tv并在v中查找值。

首先,您需要vocabularies(weight, id)types_vocabularies(vocabulary_id, type_id)上的索引。如果这样可行,那么它将消除排序。

尝试的第二种方法是先对类型进行过滤。其索引包括:types_vocabularies(type_id, vocabulary_id)vocabularies(id)

哪种方法更好取决于数据的性质。但首先尝试第一个,因为消除排序通常是一个好主意。