Mysql查询说明

use*_*265 1 mysql optimization

在加入情侣表期间的某个时候,我看到放置的条件标准在ON()子句中,有时在其中,意味着在WHERE之后.

在大量数据中,哪种方法更优化,更快?

什么会更快1.

SELECT a.column1, b.column2
FROM tablea a
JOIN tableb b
ON a.column3 = b.column3 
WHERE b.column2='Y' AND a.column1='N'
Run Code Online (Sandbox Code Playgroud)

或者这个2.

SELECT a.column1, b.column2
FROM tablea a
JOIN tableb b
ON (a.column3 = b.column3 AND b.column2='Y')
WHERE  a.column1='N'
Run Code Online (Sandbox Code Playgroud)

Kon*_*rak 6

有两种加入方式:

1/SQL-89-style,使用逗号分隔的表和WHERE子句

例:

SELECT a.column1, b.column2
FROM tablea a, tableb b
WHERE a.column3 = b.column3
Run Code Online (Sandbox Code Playgroud)

2/SQL-92-style,使用该JOIN ... ON子句

例:

SELECT a.column1, b.column2
FROM tablea a
JOIN tableb b
ON a.column3 = b.column3 
Run Code Online (Sandbox Code Playgroud)

92风格更现代的并且是优选的,因为加入读取查询时,实际上是更加明显.你可以混合使用这两种风格,它会起作用,但这是一个糟糕的主意.

关于性能,我不能比Stackoverflow上现有的答案做得更好.我将引用它的要点:

根据Peter Gulutzan和Trudy Pelzer的"SQL性能调优",在他们测试的六个或八个RDBMS品牌中,SQL-89与SQL-92样式连接的优化或性能没有区别.可以假设大多数RDBMS引擎在优化或执行查询之前将语法转换为内部表示,因此人类可读的语法没有区别.

(强调我的)

  • @Vyktor有时这不起作用.考虑一下:`SELECT*FROM tblA LEFT JOIN tblB ON tblA.id = tblB.id WHERE tblB.active ='Y'`如果tblB中没有匹配记录,则其字段将为null(duh,因为它是左连接) .但是如果`tblB.active`为null,那么`WHERE`将过滤掉那个.在这种情况下,`tblB.active ='Y'`需要处于连接条件. (2认同)