Mat*_*nco 5 mysql innodb subquery
看看这两个查询:
简单的:
mysql> SELECT * FROM omgbatch JOIN omgoutput ON (idomgbatch=omgbatch) WHERE idomgoutput = (SELECT DISTINCT lastoutput FROM omgenvelope WHERE lastinput=18658); +------------+-------+------------+------- ------+---------+----------+ | idomgbatch | 芦丁 | 批处理时间 | idmgoutput | 流量模式 | omgbatch | +------------+-------+------------+------- ------+---------+----------+ | 12174 | 8 | 20140508040930-832 | 10728 | 162 | 12174 | +------------+-------+------------+------- ------+---------+----------+ 1 行(0.00 秒)
和
复杂的:
mysql> SELECT * FROM omgbatch JOIN omgoutput ON (idomgbatch=omgbatch) WHERE idomgoutput IN (SELECT DISTINCT lastoutput FROM omgenvelope WHERE lastinput=18658); +------------+-------+------------+------- ------+---------+----------+ | idomgbatch | 芦丁 | 批处理时间 | idmgoutput | 流量模式 | omgbatch | +------------+-------+------------+------- ------+---------+----------+ | 12174 | 8 | 20140508040930-832 | 10728 | 162 | 12174 | +------------+-------+------------+------- ------+---------+----------+ 1 排(7.40 秒)
在这种情况下,我知道子查询仅返回 1 个值 ( 12174
),因此我可以将=
运算符用于子查询结果集并在 0.00 秒内得到答案。
当我保留IN
操作员时,整整需要 7.4 秒。我已将代码更改为子查询的循环和=
“主”选择中的简单代码,一切都很好,但我仍然想了解这背后的机制。
我太菜了,无法理解EXPLAIN
命令中的所有细节。
与查询IN
列表三行SELECT_TYPE PRIMARY
,PRIMARY
以及DEPENDENT SUBQUERY
与相应的行数10172
,1
和721
。对应的“键”:NULL
, PRIMARY
, fk_omgenvelope_omginput1_idx
。
在=
一个只能匹配值1版本而不是做select_types PRIMARY
,PRIMARY
并SUBQUERY
与行数1
,1
以及721
。
有10114
行表omgoutput
,1854182
行表omgenvelope
和10108
行的表omgbatch
,所以我不明白是什么10172
在复杂的EXPLAIN
输出来的。
为了完整起见,以下是查询计划的完整解释:
简单的:
+----+-------------+------------+---------+-------- -----------------------------+------------ ---------+---------+-------+------+-------------- ---------------+ | 身份证 | 选择类型 | 表| 类型 | 可能的密钥| 关键| 密钥长度 | 参考 | 行 | 额外 | +----+-------------+------------+---------+-------- -----------------------------+------------ ---------+---------+-------+------+-------------- ---------------+ | 1 | 主要 | 输出| 常量 | PRIMARY,fk_omgoutput_omgbatch1_idx | 主要 | 4 | 常量 | 1 | | | 1 | 主要 | omgbatch | 常量 | 主要 | 主要 | 4 | 常量 | 1 | | | 2 | 子查询 | omgenvelope | 参考 | fk_omgenvelope_omginput1_idx | fk_omgenvelope_omginput1_idx | 4 | | 第721话 使用哪里;使用临时| +----+-------------+------------+---------+-------- -----------------------------+------------ ---------+---------+-------+------+-------------- ---------------+
复杂的:
+----+------------+------------+--------+ -------------------------------------------------- ----------+------------------------------+-------- -+-----------------------------+-------+--------- ---------------------+ | 身份证 | 选择类型 | 表| 类型 | 可能的密钥| 关键| 密钥长度 | 参考 | 行 | 额外 | +----+------------+------------+--------+ -------------------------------------------------- ----------+------------------------------+-------- -+-----------------------------+-------+--------- ---------------------+ | 1 | 主要 | 输出| 所有 | fk_omgoutput_omgbatch1_idx | 空 | 空 | 空 | 10173 | 使用 where | | 1 | 主要 | omgbatch | eq_ref | 主要 | 主要 | 4 | trackdb.omgoutput.omgbatch | 1 | | | 2 | 相关子查询 | omgenvelope | 参考 | fk_omgenvelope_omginput1_idx,fk_omgenvelope_omgoutput1_idx | fk_omgenvelope_omginput1_idx | 4 | 常量 | 第721话 使用哪里;使用临时| +----+------------+------------+--------+ -------------------------------------------------- ----------+------------------------------+-------- -+-----------------------------+-------+--------- ---------------------+
解析这个时我会怎么想?DEPENDENT SUBQUERY
和 just SUBQUERY
withoutdependent和有什么不一样?
它似乎不仅仅是IN
执行它的子查询中的 1 个以上潜在行。用几个常量值替换子查询也很快:
mysql> 解释 SELECT * FROM omgbatch JOIN omgoutput ON (idomgbatch=omgbatch) WHERE idomgoutput IN (10728,10729,10000,10,100,0,23123); +----+-------------+-----------+--------+--------- ---------------------------+---------+---------+-- ---------------------------+------+------------+ | 身份证 | 选择类型 | 表| 类型 | 可能的密钥| 关键| 密钥长度 | 参考 | 行 | 额外 | +----+-------------+-----------+--------+--------- ---------------------------+---------+---------+-- ---------------------------+------+------------+ | 1 | 简单 | 输出| 范围| PRIMARY,fk_omgoutput_omgbatch1_idx | 主要 | 4 | 空 | 7 | 使用 where | | 1 | 简单 | omgbatch | eq_ref | 主要 | 主要 | 4 | trackdb.omgoutput.omgbatch | 1 | | +----+-------------+-----------+--------+--------- ---------------------------+---------+---------+-- ---------------------------+------+------------+
归档时间: |
|
查看次数: |
793 次 |
最近记录: |