SQL:在 Where 子句之后加入

Posted

技术标签:

【中文标题】SQL:在 Where 子句之后加入【英文标题】:SQL : Join after Where Clause 【发布时间】: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。 【参考方案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 个字符)

以上是关于SQL:在 Where 子句之后加入的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:在使用where子句的同时将2行值转换为1列并加入它

哪个更快? Spark SQL with Where 子句或在 Spark SQL 之后在 Dataframe 中使用过滤器

sql不允许在where子句比较中使用case变量[重复]

SQL WHERE 子句类似于 JOIN 查询

sql where子句中的列顺序

SQL中WHERE 和HAVING的区别