我有两张桌子如下所示

我在两个表上都有如下所示的综合索引:
我想执行以下查询
select * from users u
left join address adr
on u.id = adr.user_id
where u.login_type_id = 1
and u.langauge_id = 1
and u.enabled = true
and adr.city_id in (1,2,3,4,5)
and adr.enabled = true
order by u.level在执行查询时,我期望MySQL对两个表使用复合索引,因为where子句中的所有字段都是索引的。但是MySql使用地址表作为基,并且只使用用户的主键进行连接。
在连接两个表时,MySql是否忽略了一个复合索引?
你们能告诉我为什么MySql不对两个表使用复合索引吗?
要使查询速度最快,请在哪些字段上创建索引?
谢谢。
解释SQL

请注意,实际数据库与问题中的数据库不同,但关系和索引是相同的。
发布于 2020-06-05 07:01:17
LEFT JOIN的“右”表上有约束时(参见WHERE);优化器将把它转换成常规的JOIN。这允许它重新排列表。PRIMARY KEY通常是到表JOIN的最佳方式。INDEX是一个具有查询所需的所有列的方法。由于您指定了"covering".full_name,因此索引中列的顺序不是SELECT *,这可能非常重要。(但在你的例子中并非如此。)这可能导致不使用复合索引,甚至可能是覆盖index.=测试的列放在综合索引中。如果不是覆盖索引,优化器将停止在复合索引的第一个“范围”列上。(与example.)IN(1,2,3,4)无关的优化可能像=或范围一样,这取决于组合索引组件在排列列时的moon.更多:http://mysql.rjweb.org/doc.php/index_cookbook_mysql和http://mysql.rjweb.org/doc.php/index1
https://stackoverflow.com/questions/62207887
复制相似问题