为什么MySQL的查询速度如此之慢?
昨天我在服务器上发现一个运行缓慢的查询(此查询花费超过1分钟)。它看起来如下所示:为什么MySQL的查询速度如此之慢?,mysql,sql,query-optimization,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 表a中有40000多行,表b中有10000多行。已经在表b中的hotel_id和hotel_type列上创建了一个唯一键,如unique keyidx_hotel_id(hotel_id,ho
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
表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
根据MySQL的参考手册,当索引的所有部分都被连接使用,并且索引是主键或唯一的非空索引时,连接类型将是“eq_ref”。参见查询计划的第二行,列类型的值是“index”但是我在hotel_id和hotel_type上有一个唯一的索引,这两个列都被连接使用。连接类型“ef_ref”比连接类型“ref”更有效,“ref”比“range”更有效。“index”是除了“ALL”之外的最后一个连接类型。这就是我所困惑的,我想知道为什么这里的连接类型是“索引”。我希望我能清楚地描述我的问题,我期待着从你们那里得到答案,谢谢!Where Is Null checks可能很慢,所以可能就是这样
select * from a
where not exists ( select 1 from b where a.hotel_id=b.hotel_id and a.hotel_type=b.hotel_type )
另外:您要返回多少条记录?如果您要返回所有36804条记录,这也会减慢速度。感谢上面所有的人!我自己找到了解决问题的方法。hotel\u id和hotel\u type列没有相同的字符集。在我将它们都设置为“utf8”之后“,我的查询在不到10毫秒的时间内返回了结果。MySQL中有一篇关于左连接和索引的好文章,我强烈推荐给你们。以下是网站:更改您的选择a.*以选择a.hotel\u id、a.hotel\u type等等。选择*不仅返回数据,而且还返回更多数据。@errorare返回的数据不应影响连接的执行方式。请参阅此处,为什么要查找b.hotel_id=NULL?您将获得所有具有空hotel_id值的行的联接(如果存在)。此外,如果b.hotel_id上的唯一索引是唯一索引,则该索引对于空值无效。“表b中的hotel_id和hotel_type列上已经创建了唯一键”。a桌怎么样?它也应该有索引,应该返回大约2000多行。@luxury_zh这可能是减慢它速度的原因,特别是如果“a”包含许多列。您可以尝试指定所需的列(请参阅errorare对您的问题的第一条评论),看看这是否有帮助。您也可以尝试限制返回的记录数量。