相关疑难解决方法(0)

JOIN 条件和 WHERE 条件之间是否存在执行差异?

这两个示例查询之间是否存在性能差异?

查询 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 的一个功能。而如果它与平台相关的,我非常喜欢弄几个文件的参考资料; 我真的不知道该找什么。

mysql performance oracle

18
推荐指数
1
解决办法
7208
查看次数

使用索引的“ORDER BY column=value”(无全表扫描)

我正在尝试破解一个名为 Phabricator / Phorge 的 FLOSS 应用程序

让我们看一下这个简单的 MySQL 表,它按 ID 及其状态( 、 等)存储一些open问题:closedinvalid

CREATE TABLE `ponder_question` (
  `id`         int(10) unsigned NOT NULL AUTO_INCREMENT,
  `status` varchar(32)          NOT NULL,
  PRIMARY KEY   (`id`),
  KEY `status`  (`status`),
Run Code Online (Sandbox Code Playgroud)

我想先按特定状态排序,然后再按其他状态排序。所以:

SELECT * FROM ponder_question
  ORDER BY status='open' DESC
  LIMIT 5
Run Code Online (Sandbox Code Playgroud)

它有效,但请考虑这一点DESCRIBE。该查询显然正在检查 5000 行,这可能太多了/它正在进行全表扫描:

ID 选择类型 桌子 分区 类型 可能的键 钥匙 密钥长度 参考 过滤的 额外的
1 简单的 思考问题 无效的 指数 无效的 地位 130 无效的 5000 100.00 使用索引;使用文件排序

(相反,如果你EXPLAIN …

mysql order-by

4
推荐指数
1
解决办法
369
查看次数

标签 统计

mysql ×2

oracle ×1

order-by ×1

performance ×1