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
上建立索引。