Web*_*net 16 mysql query-optimization
以下两种方式完成条款的区别是什么?
SELECT * FROM table1 INNER JOIN table2 ON (
table2.col1 = table1.col2 AND
table2.member_id = 4
)
Run Code Online (Sandbox Code Playgroud)
我已将它们与基本查询进行比较,EXPLAIN EXTENDED并且没有看到差异.我想知道这里是否有人发现了一个更复杂/处理密集的环境的差异.
SELECT * FROM table1 INNER JOIN table2 ON (
table2.col1 = table1.col2
)
WHERE table2.member_id = 4
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 29
使用INNER连接时,这两种方法会产生相同的结果,并且应该生成相同的查询计划.
但是,JOIN(描述两个表之间的关系)和WHERE子句(从结果集中删除行)之间存在语义差异.这种语义差异应该告诉你使用哪一个.虽然它对结果或性能没有影响,但选择正确的语法将有助于代码的其他读者更快地理解它.
请注意,如果使用外部联接而不是内部联接,则可能会有所不同.例如,如果将INNER更改为LEFT并且连接条件失败,则在使用第一种方法时仍然会获得一行,但如果使用第二种方法则将其过滤掉(因为NULL不等于4).
如果您试图优化和了解数据,则通过添加子句“ STRAIGHT_JOIN”可以极大地提高性能。您有一个内部联接为ON ...因此,为了确认,您只希望将table1和table2联接在一起的记录,但只希望表2的成员ID =一些值..在这种情况下为4。
我将查询更改为将表2作为select的主表,因为它具有显式的“ member_id”,可以通过索引来优化它以限制行,然后像表1那样联接到表1
select STRAIGHT_JOIN
t1.*
from
table2 t2,
table1 t1
where
t2.member_id = 4
and t2.col1 = t1.col2
Run Code Online (Sandbox Code Playgroud)
因此,该查询将仅对member_id = 4条记录进行资格预审,然后在表1和2之间进行匹配。因此,如果表2具有50,000条记录,表1具有400,000条记录,则首先处理table2将被首先处理。限制ID = 4甚至更少,并且加入表1时的限制甚至更少。
我知道一个事实,因为我已经实现了Strat_join的很多次,因为它处理了14个以上的百万条记录的政府数据,这些数据链接到超过15个查找表,在该表中引擎感到困惑,试图在关键表上为我思考。一个这样的查询在挂起之前要花费24个小时以上的时间...添加“ STRAIGHT_JOIN”并确定查询中“主要”表的优先级,将其在2小时内降至最终正确的结果集。
| 归档时间: |
|
| 查看次数: |
5982 次 |
| 最近记录: |