有人可以调整此查询以获得更好的性能吗?
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 :(得分: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)
。
哪种方法更好取决于数据的性质。但首先尝试第一个,因为消除排序通常是一个好主意。