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

最近公司的系统一点点的开始了拆分,从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 这样数据库的时间其实不多了。

本文分享自微信公众号 - AustinDatabases(AustinDatabases)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏热爱IT

mysql 添加yum源及选择安装的版本 转

从centos6开始,官方版本的yum源中用mariadb替换了mysql,那么安装mysql一般需要去官网下载rpm包或者源码包等方式。

17020
来自专栏Devops专栏

Python with与上下文管理器

如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 “with” 关键字的语句,它通常用在什么场景呢?

16450
来自专栏Java程序猿部落

如何解决消息队列的延时以及过期失效问题?

如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

8820
来自专栏Java程序猿部落

如何保证消息队列的顺序性?

其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的?这是生产系统中常见的问题。

23650
来自专栏Java学习录

MySQL架构与SQL执行流程

负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(...

25330
来自专栏Devops专栏

Mysql 5.7.x 导出数据、表结构、导入数据

如果是导入所有数据库的数据之后,需要flush一下数据库。因为mysql库是包含用户的,如果不flush权限,则会导致这些导入的用户无法登陆使用。

17320
来自专栏Jerry的SAP技术分享

一家互联网公司校园招聘的笔试题以及答题分析

现在你负责前台web page和后台数据库查询响应的设计,请你尽可能多的列出在该场景的前后台设计里,需要考虑到的边界条件和错误处理。也就是说,请你尽可能多的列出...

16120
来自专栏Jerry的SAP技术分享

MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

11120
来自专栏Java程序猿部落

ElasticSearch是如何实现分布式的?

在搜索这块,lucene 是最流行的搜索库。几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理吗?现在早已经 out 了,因为现在很多项目都是直...

15940
来自专栏Jerry的SAP技术分享

使用Eclipse连接SAP云平台上的HANA数据库实例

版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog....

12530

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励