数据库对比系列之一

https://mp.weixin.qq.com/s/U-sYXtokqI7nzYypj1iDpA

公众号原文

 有人想让我多维度比较一下数据库做成一个系列。我很想,但是一直没完成。马上要过年了,我不想拖到明年。于是今天先开个头。

      今天这个是优化器的差别。

      我们先看看在某个场景下的三种数据库优化器如何表现?


先看Oracle的,这个w表有1万条数据。A列数值型有索引。

查看执行计划,可以用到索引w1.

这个的结果是1

接下来我们看看开发经常使用的写法。

由于子查询是一个值,子查询用到了极值函数。所以执行计划也还算可以。


即使换成=号执行计划没有改变。



那么看看MySQL的表现。表结构一致。


数据5条。


好了,这下就看出来差别了。 MySQL 这里如果是in的话会走全表。这个是他优化器做出的判断。我们不评论这样做是好还是不好。

它的真实数据是:


只是如果把真实的数据带进去发现它还是可以用到索引的。与有没有括号没有关系。

只是括号内子查询有函数的话就不行了。


这是用Oracle习惯的人,改用MySQL会遇到问题的地方之一。我们只是说Oracle的优化器做的更加智能一些,或者说贴近人能觉得合理的情况。

当然MySQL这样做也是有它的道理的。子查询里面函数不确定。

 

那么看看PostgreSQL的做法是什么?

上面是PG14版本中的一个表,w。a列数值型,a列有索引。


可以看出where a=1和机制函数都用到了索引。

那么把前面的两句带进来看。 发现了即不是和Oracle那样两种都写法执行计划不改变,也不是MySQL那样在in的时候就全表了。而是用到了索引但是不一样。


代入真实数据执行计划是一模一样的。这个三种数据库都一样。

这仅仅是优化器的一角,其他的我们有机会再展开。


请使用浏览器的分享功能分享到微信等