2015-07-28 77 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)

哪種方法更好取決於數據的性質。但首先嚐試一下,因爲消除排序通常是一個好主意。