mysql父参数传入子查询_mysql – 子查询执行一次父查询或更多?

如果我在where子句中应用静态数据,那么应用子查询会更快.例:

(查询返回5条记录作为结果集)

选择STARTDATE,ENDDATE FROM TEST STARTDATE =’2012-08-21′;

比那更快:

SELECT STARTDATE,ENDDATE FROM TEST WHERE STARTDATE =(从TEST2 LIMIT 1开始选择STARTDATE);

或者它们在任何情况下是相同的?

每次通过查询与每条记录进行比较或仅进行1次时,子查询会执行吗?

解决方法:

在MySQL 5.6之前,内部查询在外部行中的每个条目执行一次,并且很容易证明:

mysql> SELECT COUNT(*) FROM sample_data;

+----------+

| COUNT(*) |

+----------+

| 8 |

+----------+

1 row in set (0.00 sec)

mysql> SELECT COUNT(*) FROM sample_data WHERE id = (SELECT SLEEP(1) );

+----------+

| COUNT(*) |

+----------+

| 0 |

+----------+

1 row in set (8.00 sec)

请注意,查询需要8秒,因此SLEEP(1)执行8次,sample_data中的每一行执行一次.

MySQL 5.6实现了subquery materialization,从理论上讲,它可以防止在许多情况下发生这种情况. MariaDB还有一个大大改进的优化器,可以防止这种情况.

在大多数情况下,最好避免使用MySQL中的子查询.

标签:mysql,select

来源: https://codeday.me/bug/20190806/1595564.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值