gpt4 book ai didi

mysql - 带有文本的大型表上 SQL 连接的过滤顺序

转载 作者:行者123 更新时间:2023-11-29 19:16:55 24 4
gpt4 key购买 nike

我有多个大型表(数百万行)的数据,需要通过单个查询中的内部联接将所有数据组合起来并进行过滤。这些表都很大,其中一些包含大文本列。但是,我不需要查询结果中的所有大文本列。当我将表加入子查询时,我可以逐步过滤这些表,或者我可以跳过子查询,只加入所有表并在 select 子句中进行过滤。其中哪一个更快,为什么?

过滤子查询的示例:

select aa.col1, aa.col2, aa.col3, aa.col4, c.col5, c.col6 
from
(select a.col1, a.col2, b.col3, b.col4
from table_a a
join table_b b using(col1)
where a.col2 < 10 and b.col3 > 3)
as aa
join table_c c using(col1)

没有子查询的示例:

select a.col1, a.col2, b.col3, b.col4, c.col5, c.col6
from table_a a
join table_b b using(col1)
join table_c c using(col1)
where a.col2 < 10 and b.col3 > 3

我做了一些研究,有些人说过滤顺序并不重要,sql 查询优化器会选择最有效的路线。但是,我也看到一些答案说要逐步过滤。

通过我自己在 MYSQL 中的实验,我发现由于文本字段较大,使用子查询可以加快速度。获取时间主导了 SQL 执行时间(我猜是由于文本字段较大),并且在第二次连接之前过滤数据会大大减少获取时间。但是,我不了解其基 native 制,也不知道这是否是我的特定设置的侥幸或普遍适用。 SQL 中此类查询有通用规则吗? Microsoft SQL Server 与 MYSQL 中这些类型的查询有区别吗?我主要关心整个查询的速度。

最佳答案

根据我的研究,第二个查询更快。因为子查询需要时间。假设您有一个查询:

SELECT * FROM table where id IN (SELECT id FROM table where 条件 1 AND 条件 2 )

在此查询中,首先执行子查询,选择子查询后,它检查外部 where 条件,然后选择。

如果您使用联接,那么速度会更快,因为它首先在公共(public)字段上联接表,然后检查其他条件,然后选择数据。所以它们更快。

关于mysql - 带有文本的大型表上 SQL 连接的过滤顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42633887/

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