影响MySql性能的因素

      近日,笔者阅读了一些关于mysql的优化原则,及其影响mysql性能的因素,下面做一些讲解:


哪些数据不适合存在数据库中?

  • 二进制数据(例如视频、图片、音频直接存放在磁盘中)
  • 超大文本(如:小说文章等,如果存放在数据库中,会降低查询的效率,增加磁盘IO读写次数)
  • 流水队列数据(一些系统中,每次交易,存放等都会产生流水队列数据,数据量非常庞大)

那些数据存放在cache(缓存)中?

  • 系统的配置信息
  • 活跃用户的基本数据(强调活跃)、活跃用户的定制化信息
  • 基于时间段的统计数据(首页展示前一段时间的统计数据,可以存放在缓存当中,合理的使用缓存,大大的降低了磁盘的IO次数,从而提高性能)

减少数据库的交互次数

在这里我们列举一个n+1的问题,总所周知,在使用mybatis的时候当a对象中包含b对象(也就是一个对象存在一个关联对象),a对象列表中显示关联对象b的属性,使用一条sql去查询a对象,那么使用n条sql把n个对应的属性查出来(查询所有数据的时候会产生这样的问题)。

  • 使用连接的方式去解决

优点:解决了n+1的问题,减少了和数据库的交互次数,从而降低了磁盘的io次数

缺点:如果内联的表过多,那么会使性能下降;如果存在n个对象在表中关联1个对象,结果集会增加,从数据库到应用的响应的时间会变大,结果集增加,排序也会影响性能。

  • 使用冗余字段的方式去解决

a表中冗余b表中的字段,使用一条sql就可以查询出来我们想要的结果,但是如果b中的信息更新,那么a表也会对应的更新。

  •     使用1+1的方式

使用1条sql去查询a表中的对象,得到b表所对应的id,存在一对多的关系,在程序中把结果集中的b列id去重,使用sql语法查询出b表中的信息,再通过程序设值。这样既解决了n+1的问题,程序是在内存中运行的,响应的速度大大提高了。

过度的依赖sql的功能,在适当的时候我们使用程序来进行处理可以有效的提高效率。

 

下面是mysql执行的过程

影响MySql性能的因素影响MySql性能的因素

1、客户端发送一条查询到服务端

2、服务器通过权限检验后,首先检验查询缓存,如果在缓存中得到了结果,那么立即返回。否则执行下一步

3、Mysql服务端进行sql的解析,预处理,再由优化器根据该sql所涉及到的数据表的统计信息进行计算,生成对应的执行计划

4、Mysq根据优化器生成的执行计划,调用存储引擎的api来执行查询

5、将结果返回给客户端

 

SQL执行的最大瓶颈在于磁盘的IO,即数据的读取;不同SQL的写法,会造成不同的执行计划的执行,而不同的执行计划在IO的上面临完全不一样的数量级,从而造成性能的差距。

通过图中我们可以清晰的观察出来,影响查询根本的原因是io,但io的次数又是执行计划所决定的,执行计划是解析器解析语法产生的,我们通过查看cup的使用率,io的次数,从而来优化sql语句。

 

Schema(表结构)对性能的影响

  • 冗余数据的处理

适当的数据冗余可以提高系统的整体查询的效率

关系型数据的三种范式;

第一范式:对关系模型的基本要求,不满足第一范式的数据库就不是关系型数据库,数据库表的每一列都是不可分割的基本数据项,同一列中不能存在多个值。

第二范式:数据库表中每个实例或行必须可以被唯一的区分

第三范式:要求一个数据库表中不包含已在其他表中包含的非关键字信息(不允许存在冗余数据的现象)

  • 大表拆小表
  1. 在一个数据库中一般不会设置属性过多的表
  2. 存在大数据的列单独存在小表当中(提高查询等语句的效率)
  • 3、把常用属性拆分成小表

1、减少查询是所需要的列

2、便于常用属性的集中缓存