使用笛卡尔连接优化 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 ...
——它可能会说“使用连接缓冲区”。这是它将一张表加载到内存中(如果不是太大)并反复扫描它以查找数据的地方。不是一个漂亮的网站,但比“加入缓冲区”发挥作用之前要快得多。
既然你没有ON
或WHERE
将两张表绑定在一起,你真的想要“交叉连接”吗?也就是说,如果有 40 'blah' 和 70 '1',你最终会得到 40*70 = 2800 行吗?
至于优化,优化器将选择其中一张表,优先选择具有有用索引的表,扫描它(索引或表),然后重复使用连接缓冲区(如果可能)扫描(索引或表) 的另一个。
换句话说,如果可能,一个表将使用索引,在笛卡尔积之前进行过滤,另一个可能使用连接缓冲区。如果表不是太大,性能也不会太差。
【讨论】:
以上是关于使用笛卡尔连接优化 sql 查询的主要内容,如果未能解决你的问题,请参考以下文章