gpt4 book ai didi

mysql 连接效率 - 用 where 连接然后用其他东西连接

转载 作者:行者123 更新时间:2023-11-28 23:12:56 24 4
gpt4 key购买 nike

我有一个如下所示的查询:

select `adverts`.*
from `adverts`
inner join `advert_category` on `advert_category`.`advert_id` = `adverts`.`id`
inner join `advert_location` on `adverts`.`id` = `advert_location`.`advert_id`
where `advert_location`.`location_id` = ?
and `advert_category`.`category_id` = ?
order by `updated_at` desc

这里的问题是我有一个庞大的数据库,而这个响应绝对是在破坏我的数据库。

我真正需要的是先做连接,然后做 where 子句。这会将我的响应从大约 100k 个查询减少到不到 10k,然后我想进行另一个连接,以便再次减少响应,以便我可以获得类别项目的 advert_location。

照原样做是行不通的。

那么,我该如何着手使用连接和 where 条件,然后在获得该响应后使用 where 条件进一步连接?

谢谢

最佳答案

这是您的查询,写得更简单一些,以便我可以阅读:

select a.*
from adverts a inner join
advert_category ac
on ac.advert_id = a.id inner join
advert_location al
on al.advert_id = a.id
where al.location_id = ? and
ac.category_id = ?
order by a.updated_at desc;

我推测 advert_categoryadvert_locations 每个广告有多个行。在这种情况下,您将获得每个广告的笛卡尔积。

编写查询的更好方法是使用 exists:

select a.*
from adverts a
where exists (select 1
from advert_location al
where al.advert_id = a.id and al.location_id = ?
) and
exists (select 1
from advert_category ac
where ac.advert_id = a.id and ac.category_id = ?
)
order by a.updated_at desc;

对于此版本,您需要索引 advert_location(advert_id, location_id)advert_category(advert_id, category_id),可能还有 advert(updated_at, id)

关于mysql 连接效率 - 用 where 连接然后用其他东西连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45129833/

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