这两个示例查询之间是否存在性能差异?
查询 1:
select count(*)
from table1 a
join table2 b
on b.key_col=a.key_col
where b.tag = 'Y'
Run Code Online (Sandbox Code Playgroud)
查询 2;
select count(*)
from table1 a
join table2 b
on b.key_col=a.key_col
and b.tag = 'Y'
Run Code Online (Sandbox Code Playgroud)
注意唯一的区别是补充条件的位置;第一个使用WHERE子句,第二个将条件添加到ON子句中。
当我在 Teradata 系统上运行这些查询时,解释计划是相同的,JOIN 步骤显示了每种情况下的附加条件。但是,在关于 MySQL 的这个 SO 问题上,其中一个答案表明首选第二种样式,因为WHERE在进行连接之后进行处理。
编码这样的查询时是否有一般规则要遵循?我猜它必须依赖于平台,因为它显然对我的数据库没有影响,但这也许只是 Teradata 的一个功能。而如果它是与平台相关的,我非常喜欢弄几个文件的参考资料; 我真的不知道该找什么。
为什么这个查询
DELETE FROM test
WHERE id = ( SELECT id
FROM (SELECT * FROM test) temp
ORDER BY RAND()
LIMIT 1
);
Run Code Online (Sandbox Code Playgroud)
有时删除 1 行,有时删除 2 行,有时什么都不删除?
如果我用这种形式写:
SET @var = ( SELECT id
FROM (SELECT * FROM test) temp
ORDER BY RAND()
LIMIT 1
);
DELETE FROM test
WHERE id=@var;
Run Code Online (Sandbox Code Playgroud)
那么它可以正常工作 - 子查询有问题吗?
根据文档MySQL Explain Output format,MySQL 使用嵌套循环连接方法解析所有连接。有没有办法强制 MySQL 使用散列连接?