Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MySQL的查询速度如此之慢?_Mysql_Sql_Query Optimization - Fatal编程技术网

为什么MySQL的查询速度如此之慢?

为什么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

昨天我在服务器上发现一个运行缓慢的查询(此查询花费超过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 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对您的问题的第一条评论),看看这是否有帮助。您也可以尝试限制返回的记录数量。