为什么这个查询对MySQL这么慢?

lux*_*_zh 5 mysql sql query-optimization

昨天我发现在服务器上运行一个慢查询(这个查询花费超过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".这是我很困惑的,我想知道为什么这里的连接类型是"索引".我希望我能清楚地描述我的问题,我期待着你们的回答,谢谢!

Sam*_*Sam 1

Where Is Null 检查可能会很慢,所以也许就是这样。

select * from a 
where not exists ( select 1 from b where a.hotel_id=b.hotel_id and a.hotel_type=b.hotel_type )
Run Code Online (Sandbox Code Playgroud)

另外:您要返回多少条记录?如果您要返回所有 36804 条记录,这也会减慢速度。