【问题标题】:SQL : Join after Where ClauseSQL:在 Where 子句之后加入
【发布时间】:2019-01-12 21:35:12
【问题描述】:

我有一个很大的 SQL 语句。

但我想测试 firsttable (T1) 上的 where 子句,然后在使用 where 子句选择的行上进行所有连接。

因为实际上查询很慢,导致MySQL将所有表join到t1,然后测试where子句!

SELECT * from FIRSTTABLE T1
        LEFT JOIN T2 on (....)
        LEFT JOIN T3 on (....)
WHERE T1.column = '1' OR T1.column= '5'

有什么想法吗?

【问题讨论】:

  • 使用explain 找出您需要索引的位置
  • 在查询优化问题中,您应该为查询中的每个表包含 SHOW CREATE TABLE 的输出。帮助我们帮助您——不要让我们猜测您当前拥有哪些索引和数据类型。还包括当前查询的 EXPLAIN。

标签: mysql sql query-optimization


【解决方案1】:

你可以这样做:

SELECT * from 
(
SELECT * from FIRSTTABLE T1
WHERE T1.column = '1' OR T1.column= '5'
) as T2 

LEFT JOIN T3 on (....)
LEFT JOIN T4 on (....)

【讨论】:

    【解决方案2】:

    评论太长了。

    SQL 查询在执行之前被编译优化。查询中子句的顺序实际上与最终的执行计划无关。更具体地说,WHERE 子句中的过滤条件可以发生在JOIN 处理之前、之后甚至期间。

    您可以通过了解索引开始了解 SQL 优化。 MySQL 文档是一个非常合理的起点。

    【讨论】:

    • 即使 where 语句只过滤原始表而不是连接表也没有技巧?
    • @Anthony 。 . .优化器根据数据和可用索引的统计信息来决定查询的运行方式。
    • (还剩 180 个字符)
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 2021-08-16
    • 2020-12-14
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    相关资源
    最近更新 更多