昨天我发现在服务器上运行一个慢查询(这个查询花费超过1分钟).它看起来像这样:
select a.* from a
left join b on a.hotel_id=b.hotel_id and a.hotel_type=b.hotel_type
where b.hotel_id is null
Run Code Online (Sandbox Code Playgroud)
表a中有40000多行,表b中有10000多行.已经在表b中的列hotel_id和hotel_type上创建了一个唯一的键,如UNIQUE KEY idx_hotel_id(hotel_id,hotel_type).所以我使用了explain关键字来检查查询计划.这个sql和我得到了如下结果:
type key rows
1 SIMPLE a ALL NULL NULL NULL NULL 36804
1 SIMPLE b index NULL idx_hotel_id 185 NULL 8353 Using where; Using index; Not exists
Run Code Online (Sandbox Code Playgroud)
根据MySQL的参考手册,当连接使用索引的所有部分并且索引是PRIMARY KEY或UNIQUE NOT NULL索引时,连接类型将是"eq_ref".参见查询计划的第二行,列类型的值是"index".但我确实在hotel_id和hotel_type上有唯一索引,并且连接使用了两列.连接类型"ef_ref"比连接类型"ref"和"ref"更有效"比"范围"更有效."索引"是最后一个连接类型我想要除了"ALL".这是我很困惑的,我想知道为什么这里的连接类型是"索引".我希望我能清楚地描述我的问题,我期待着你们的回答,谢谢!