MySQL 的SQL引擎很差吗? 由一个同学提出问题引出的实验
开头还是介绍一下群,如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题,有需求都可以加群群内有各大数据库行业大咖,可以解决你的问题。加群请联系 liuaustin3 ,(共2310人左右 1 + 2 + 3 + 4 +5+6) 新人奖直接分配到5群,5群已经停止进行自由申请 已建立6群(接近100)。
有了PostgreSQL的出现,MySQL的数据库在SQL的处理上的问题一直被人当做有意思的事情来去谈论,实际上每种数据库有自己不同的个性,我们掌握就好,无需特别的进行一些情感上的好恶。
MySQL 最近一个同学给我提了一个问题,关于为什么一个简单的语句,并且语句中提取的数据是唯一的一条,而却在下面循环了三次,因为我没有他的数据,也仅仅是看了执行计划和语句,又因为是截图,所以只是简单的看了看。
不过今天转念一想,到底MySQL 8 的数据处理部分,基于我之前在MySQL 5.6 5.7等积累的一些关于 子查询差的口碑,是否被改善了的事情又重新让我想起了,8.0 是不是更好,随即使用了8.031版本的MySQL 数据库。
这里我们使用了一个MYSQL 的emaple数据库,并编造了一段可以重新写成两种方式的SQL ,我们直接来看一下.
select o.*<br>from orders as o <br>left join orderdetails as d on o.ordernumber = d.ordernumber and o.ordernumber = (select ordernumber <br>from orders where requiredDate > '2003-01-12' and requiredDate '2003-01-12' and o.requiredDate Nested loop left join (cost=1.36 rows=4) (actual time=0.070..0.075 rows=4 loops=1)<br> -> Index range scan on o using idx_requiredDate over ('2003-01-12' Covering index lookup on d using PRIMARY (orderNumber=(select #2)) (cost=0.65 rows=4) (actual time=0.007..0.010 rows=4 loops=1)<br> -> Select #2 (subquery in condition; run only once)<br> -> Filter: ((orders.requiredDate > DATE'2003-01-12') and (orders.requiredDate Covering index range scan on orders using idx_requiredDate over ('2003-01-12' Filter: ((orders.requiredDate > DATE'2003-01-12') and (orders.requiredDate Covering index range scan on orders using idx_requiredDate over ('2003-01-12' Nested loop left join (cost=1.89 rows=9) (actual time=0.034..0.039 rows=4 loops=1)<br> -> Index range scan on o using idx_requiredDate over ('2003-01-12' Filter: ((o2.requiredDate > '2003-01-12') and (o2.requiredDate Single-row index lookup on o2 using PRIMARY (orderNumber=d.orderNumber) (cost=0.26 rows=1) (actual time=0.001..0.001 rows=1 loops=4)<br><br><br>