MySQL使用内部连接和where选择distinct。要创建哪些索引?
我有以下疑问MySQL使用内部连接和where选择distinct。要创建哪些索引?,mysql,sql,database,Mysql,Sql,Database,我有以下疑问 SELECT DISTINCT table_a.id FROM table_a INNER JOIN table_b ON table_a.id = table_b.profile_id WHERE table_b.role_id IN (1,2,3,4,5,6) 我在表_b上有一个索引: CREATE INDEX test_index ON table_b (role_id, profile_id) 但解释给了我“使用临时”表 Using where; Using inde
SELECT DISTINCT table_a.id FROM table_a
INNER JOIN table_b ON table_a.id = table_b.profile_id
WHERE table_b.role_id IN (1,2,3,4,5,6)
我在表_b上有一个索引:
CREATE INDEX test_index ON table_b (role_id, profile_id)
但解释给了我“使用临时”表
Using where; Using index; Using temporary
我应该创建什么索引来克服这个问题
更新:
解释输出
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | SIMPLE | table_b | range | table_b_e1c74d82,test_index | test_index | 5 | NULL | 12860 | Using where; Using index; Using temporary |
| 1 | SIMPLE | table_a | eq_ref | PRIMARY | PRIMARY | 4 | table_b.profile_id | 1 | Using index |
表\u b\u e1c74d82
索引是一个(profile\u id,production\u id,role\u id)
索引。我认为您需要以下索引:
role_id in table_b
profile_id in table_b
id in table_a
MySQL将在查询中运行它的Optimizer,并将为任务选择最好的一个
使用临时表仅仅意味着为了解决查询,MySQL需要创建一个临时表来保存结果。如果查询包含不同列列表的
JOIN
、groupby
和orderby
子句,通常会发生这种情况。我们可以看到完整的EXPLAIN
结果吗?DISTINCT
可能会给你这个问题。问题已更新。是的,这是独特的。但这会导致性能大幅下降。AFAIK这是由于使用了临时的。我感觉MySQL 5.6可能能够使用优化,您可以显式地为这个查询启用它。是的,这是因为不同的
。但是这会导致性能下降,所以我想防止使用临时的。您在(角色id,配置文件id)
上有复合索引,您是否只有配置文件id
也有,如果没有,您可以尝试使用它来提高性能,因为它将用于加入,我不认为复合索引会非常有用,它相当于只在role\u id
上建立索引。