【问题标题】:Mysql Execution of subqueriesMysql执行子查询
【发布时间】:2012-09-22 11:22:00
【问题描述】:

假设我有这样的查询

SELECT DISTINCT customer_name 
FROM borrower 
WHERE customer_name in (SELECT customer_name FROM depositor)

我们可以将上面视为两个查询

一个

SELECT DISTINCT customer_name 
FROM borrower 
WHERE customer_name

B

SELECT customer_name 
FROM depositor

哪个先执行?这条规则对所有子查询都一样吗?

我们可以编写哪些类型的子查询?给我一些指导,让我开始使用教程链接。

【问题讨论】:

  • 一些指针?说明书呢? dev.mysql.com/doc/refman/5.5/en/index.html
  • 您可以使用 EXISTS 来改进 IN ...例如 WHERE EXISTS (SELECT 1 FROM depositor AS b WHERE b.customer_name = borrower.customer_name)

标签: mysql subquery


【解决方案1】:

编辑,因为第一个答案是错误。但是解释是正确的:|

A 先执行。当子查询相互关联时,应用上面显示的“所有”子查询。

+----+--------------------+-----------+----------------+---------------+---------------+---------+------+------+----------+--------------------------+
| id | select_type        | table     | type           | possible_keys | key           | key_len | ref  | rows | filtered | Extra                    |
+----+--------------------+-----------+----------------+---------------+---------------+---------+------+------+----------+--------------------------+
|  1 | PRIMARY            | borrower  | index          | NULL          | customer_name | 52      | NULL |    6 |   100.00 | Using where; Using index |
|  2 | DEPENDENT SUBQUERY | depositor | index_subquery | customer_name | customer_name | 52      | func |    1 |   100.00 | Using index              |
+----+--------------------+-----------+----------------+---------------+---------------+---------+------+------+----------+--------------------------+

顺便说一句。 MySQL 6 将消除这个问题,并且两个查询的选择类型都将变为PRIMARY。见1

【讨论】:

  • 不要反对,因为 MySQL 不是我真正的领域,但这真的是真的吗?所以你的意思是在 MySQL 中所有的子查询首先被具体化到一个临时表中?例如,MySQL 不能在这里进行合并连接?
  • MySQL 针对连接进行了优化,不会优化子查询。一些子查询可以写成 dest 选择来提高它们的速度。 ''SELECT col FROM t1 WHERE id_col IN (SELECT id_col2 FROM t2 WHERE 条件);该语句可以重写如下:SELECT DISTINCT col FROM t1, t2 WHERE t1.id_col = t2.id_col AND condition;´´
  • @MartinSmith:AFAIK MySQL 中的优化器非常有限,它不会重写这样的查询。 MySQL 历来在子选择方面非常糟糕(我认为它实际上在手册中的某处有所说明)
  • 如果depositor 有100 万行而borrower 有两个呢?你是说它仍然会首先评估depositor 上的查询?
  • MySQL 将按照上面的说明进行操作。
猜你喜欢
  • 1970-01-01
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 2016-09-13
  • 2013-06-30
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多