MYSQL 中的查询技巧 与 MYSQL 8 并行查询

2019-06-24 15:51:29 浏览数 (1)

最近公司的系统一点点的开始了拆分,从ORACLE 转移到 MYSQL 中,部分程序员的想法在使用MYSQL中还是没有转变过来,直接将ORALCE中的查询语句直接搬到了MYSQL。使用MYSQL 重要的两点,1 逻辑上移,数据库不在是承担你逻辑的第一选择,程序的比重将变得更重要 2 数据库容器化,数据库将变得不再那么重要,而是仅仅是承载数据的地方,或者甚至高级的设计,数据库将变得可有可无,这当然也的和业务挂钩,不是放之四海都OK。

这就直接抛出一个问题,就是MYSQL的查询技巧还重要吗?当然如果你还要用MYSQL 来进行数据库的提取和查询,那就必须重视MYSQL的查询技巧。

下图是以 mysql 8.015 这个版本作为语句执行的基础

其实两条语句查询的结果是一样的,仅仅是写法不一样,给出的执行计划就是不一样的

以目前最新版本的MYSQL来说,从上面的例子里面,还是要鼓励直接查询,尽量避免子查询。当然如果子查询能大幅度的降低参与计算的数据量,则还是可以对比继续使用的。

下面我们可以看看MYSQL 中的index merge 的功能到底能提升查询性能多少

1 我们先关闭index_merge

很明显,索引都白搭了

2 我们打开index_merge

明显看到,查询中使用or 的时候index merge 对数据查询的帮助是很大的

实际当中,(SSD 硬盘 440行数据的 fetch 不开启 0.195秒相当于全表扫描,开启0.001秒)

mysql 8 是默认开启的。

3 时间范围对选择索引的影响

下面两条语句对于索引的选择会截然不同,我们建立四个索引

Select * from employees where first_name ='Georgi' or last_name ='Preusig' and birth_date > '1950-01-01' and birth_date < '1950-01-02';

select * from employees where first_name ='Georgi' or last_name ='Preusig' and birth_date > '1950-01-01' ;

从上图可以看出由于时间范围,最后走了不同的索引,后面其实我还做了一些其他的测试,例如将时间的范围扩大,发现目前的MYSQL 8.015 很聪明的走了应该走的索引,看了MYSQL8.0 这个版本的查询优化器要比MYSQL 5.7 进步不少。

最后,我们看看MYSQL 8.0的并行查询,并行查询,其实在 PG, SQL SERVER , ORACLE 中都有,但形式不同,MYSQL 8 之前是没有并行查询这个概念的,MYSQL 8 引入了并行查询,我们看看到底并行查询,对查询有什么帮助。

首先我们将并行度降低到 1 ,默认是 4 查询后,获得的时间是 0.109秒 然后我们将并行度调整为 6 在次查询,获得的时间是 0.062秒

由此可见并行度这个东西,对于查询是有帮助的,尤其count(*) 这样经常被诟病的查询方式也在并行度中获益。

如果你经常观察MYSQL 和 POSTGRESQL ,你就会感到开源数据库越来越强大,留给ORACLE 和 SQL SERVER 这样数据库的时间其实不多了。

0 人点赞