使用笛卡尔连接优化 sql 查询

Posted

技术标签:

【中文标题】使用笛卡尔连接优化 sql 查询【英文标题】:Optimising sql query with cartesian join 【发布时间】:2016-05-04 20:16:44 【问题描述】:

我有 2 个表 sl 和 sd。

如果可以的话,我想优化下面的查询

select sl.*, sd.* from sl join sd where sl.conf_id='blah' and sd.for_as=1

我的理解是首先执行笛卡尔积,然后进行过滤。

有没有办法先完成过滤?

【问题讨论】:

两张表有关系吗? ..如果是,在哪一列? @scaisEdge 2 个表之间存在未包含在上述查询中的关系。实际查询是 2 个选择的联合,一个查询在相关列上具有内部连接,而后半部分在上面的问题中提到。我需要优化这一半。 My understanding is that the cartesian product is first performed and then filtering happens. 不,mysql通常可以优化它,无论如何-检查执行计划以确认实际发生了什么 这个查询应该返回一个错误,抱怨缺少ON。如果你真的需要交叉连接,MySQL 应该足够聪明,可以在连接之前应用 WHERE 条件。 【参考方案1】:

运行EXPLAIN SELECT ...——它可能会说“使用连接缓冲区”。这是它将一张表加载到内存中(如果不是太大)并反复扫描它以查找数据的地方。不是一个漂亮的网站,但比“加入缓冲区”发挥作用之前要快得多。

既然你没有ONWHERE 将两张表绑定在一起,你真的想要“交叉连接”吗?也就是说,如果有 40 'blah' 和 70 '1',你最终会得到 40*70 = 2800 行吗?

至于优化,优化器将选择其中一张表,优先选择具有有用索引的表,扫描它(索引或表),然后重复使用连接缓冲区(如果可能)扫描(索引或表) 的另一个。

换句话说,如果可能,一个表将使用索引,在笛卡尔积之前进行过滤,另一个可能使用连接缓冲区。如果表不是太大,性能也不会太差。

【讨论】:

以上是关于使用笛卡尔连接优化 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章

[转]sql语句中出现笛卡尔乘积 SQL查询入门篇

避免 Spark SQL 查询的笛卡尔连接

SQL中的笛卡儿积问题和多表连接操作

SQL多表查询

关系查询处理和关系优化-第三节:查询优化之代数优化

sql99和sql92分别实现连接和子查询和分页查询