2015-07-28 34 views
-1

任何人都可以调整此查询以获得更好的性能吗?我该如何优化以下mysql查询

 
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

+0

以什么方式优化?,你有性能方面的原因吗? –

+0

将索引添加到'type_id' – Jens

+0

为什么你认为它需要调整?它看起来很好。 – tolanj

回答

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)

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