【发布时间】:2019-10-30 08:18:51
【问题描述】:
O'reilly Optimizing SQL Statments Book 中的Explaining MySQL Explain 一章,最后有这个问题。
以下是在父/子关系中检索孤立父记录的业务需求示例。此 SQL 查询可以用三种不同的方式编写。虽然输出产生相同的结果,但 QEP 显示了三种不同的路径。
mysql> EXPLAIN SELECT p.*
-> FROM parent p
-> WHERE p.id NOT IN (SELECT c.parent_id FROM child c)\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: p
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 160
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: c
type: index_subquery
possible_keys: parent_id
key: parent_id
key_len: 4
ref: func
rows: 1
Extra: Using index
2 rows in set (0.00 sec)
mysql> EXPLAIN SELECT p.*
-> FROM parent p
-> LEFT JOIN child c ON p.id = c.parent_id
-> WHERE c.child_id IS NULL\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: p
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 160
Extra:
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: parent_id
key: parent_id
key_len: 4
ref: test.p.id
rows: 1
Extra: Using where; Using index; Not exists
2 rows in set (0.00 sec)
mysql> EXPLAIN SELECT p.*
-> FROM parent p
-> WHERE NOT EXISTS
-> SELECT parent_id FROM child c WHERE c.parent_id = p.id)\G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: p
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 160
Extra: Using where
*************************** 2. row ***************************
id: 2
select_type: DEPENDENT SUBQUERY
table: c
type: ref
possible_keys: parent_id
key: parent_id
key_len: 4
ref: test.p.id
rows: 1
Extra: Using index
2 rows in set (0.00 sec)
哪个最好?随着时间的推移,数据增长会导致不同的 QEP 表现更好吗?
据我所知,书上或互联网上都没有答案。
【问题讨论】:
-
请注意,这两个查询是不等价的。如果
child.parent_id不能为 NULL,它们将返回相同的结果。 -
是的,我想它是隐含的 parent_id 是一个 fk,因为它也是子表中的一个索引并且没有孩子是孤立的,只有父母是。讽刺。
-
FK 可以为 NULL(可选关系)。顺便说一句:哪本书?您的报价来源是什么?
-
对不起,我刚刚编辑了我的评论。 oreilly.com/library/view/effective-mysql-optimizing/… 是书。