gpt4 book ai didi

mysql - ORDER BY 子句使查询变慢,尽管结果集很小

转载 作者:可可西里 更新时间:2023-11-01 08:35:20 24 4
gpt4 key购买 nike

我有以下表格(删除了不相关的内容):

create table Payment (
id int not null auto_increment,
status int not null,
primary key(id)
);
create table Booking (
id int not null auto_increment,
paymentId int not null,
nrOfPassengers int not null,
primary key(id),
key paymentFK (paymentId),
constraint paymentFK foreign key (paymentId) references Payment(id)
);

Booking 包含约 456k 行,Payment 包含约 331k 行。以下查询需要 0.06 秒并返回 97 行:

select * from Booking b
join Payment p on b.paymentId = p.id
where p.status = 3

如果我添加一个 order by 子句,查询将花费 4.4 秒,几乎慢了 100 倍:

select * from Booking b
join Payment p on b.paymentId = p.id
where p.status = 3
order by b.nrOfPassengers

第一个查询的解释:

id, select_type, table, type, possible_keys, key,       key_len, ref,  rows,   Extra
1, SIMPLE, p, ALL, PRIMARY, NULL, NULL, NULL, 331299, Using where
1, SIMPLE, b, ref, paymentFK, paymentFK, 9, p.id, 1, Using where

第二个:

id, select_type, table, type, possible_keys, key,       key_len, ref,  rows,   Extra
1, SIMPLE, p, ALL, PRIMARY, NULL, NULL, NULL, 331299, Using where; Using temporary; Using filesort
1, SIMPLE, b, ref, paymentFK, paymentFK, 9, p.id, 1, Using where

我使用的是 MySQL 5.1.34。

查询中使用的 where 子句从 Payment 中过滤掉绝大多数行。我的印象是 MySQL 在使用(高度选择性的)where 子句过滤结果集之前对结果集进行排序。我是对的吗?如果是这样,它为什么要这样做?我已尝试分析这两个表,但查询计划没有任何变化。

最佳答案

首先,确保您的表上有适当的索引。假设您这样做并且它仍然比预期的要慢,您可以将结果放入子查询而不对它们进行排序,然后添加 ORDER BY 子句:

SELECT * 
FROM (
select * from Booking b
join Payment p on b.paymentId = p.id
where p.status = 3
)
ORDER BY nrOfPassengers

我不确定这有多大(或是否)有帮助,因为当我查看执行计划时它会添加一行,但它可能会更快。

祝你好运。

关于mysql - ORDER BY 子句使查询变慢,尽管结果集很小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14608897/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com