vlambda博客
学习文章列表

MySQL服务查询优化

一、服务接口性能测试相关

TP指标:
如TP50:指在一个时间段内(如5分钟),统计该方法每次调用所消耗的时间,并将这些时间从小到大的顺序进行排序,取第50%的那个值作为TP50值;配置此监控指标对应的报警阈值后,需要保证在这个时间段内该方法所有调用的消耗时间至少有50%的值要小于此阈值,否则系统会报警。
响应时间的其他指标:最大值、 平均值等

QPS概念:
定义:单个进程每秒请求服务器的成功次数

TP指标和QPS的关系:
TP指标反映的服务器接口的耗时,QPS反映的是单个进程每秒请求服务器的成功次数。如果服务器接口的耗时降低,服务器能够支撑的QPS自然就会上升。同样,如果服务器能够支撑的QPS下降了,说明耗时在增加,TP指标在变差。
在开发完服务接口,可利用jmeter压测工具测试服务接口的TP指标,分析服务的响应耗时。

二、mysql索引查询优化原理

2.1 索引原理

N固定,m越大,h越小。而m=磁盘块size/数据项size,磁盘块大小即一个数据页的大小是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量小,这也是为什么b+树要求把真实的数据放到叶子节点。
当b+树的数据项是复合的数据结构(比如name,age,sex)时,b+树按照从左到右的顺序建立搜索树。比如当(张三,20,F)这样的数据来检索时,b+树会优先确定name,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的数据来检索时,b+树就不知道下一步该查哪个节点,因为建立搜索树时name时第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里。比如当(张三,F)这样的数据来检索时,b+树可用name来指定搜索方向,但因下一字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了。这个性质称为索引的最左匹配特性。

2.2 主键索引和普通索引

每张表都有主键索引,且是根据主键顺序存放数据的,如果建表时未定义主键,则数据库会自己生成rowid当主键。主键索引又被称为聚簇索引。主键索引的b+树的叶子节点存储的是正行数据。
普通索引又称为二级索引或非主键索引,在b+树的叶子节点存储的是主键值。如下面的SQL语句:

select b from t where a=10

在执行时,数据库会在a的索引表中查询a='xx'对应到的主键值,再用这个主键到主键索引中查询需要的数据,这个过程叫做回表操作。

2.3 覆盖索引和索引下推

上面提到在执行sql时,会执行回表操作,回表操作多查询一次主键索引树,影响了效率。那有什么办法可以避免呢?答案就是建立一个联合索引INDEX index_a_b (a, b),这样数据在查询时就直接拿到了需要的b字段的值,不需要再进行回表操作。例如查询主键sql也是不需要回表操作的,这个就是覆盖索引的概念了。
索引下推是MySQL5.6引入的功能,指的是可以在遍历的过程中就对包含的字段先做判断,直接过滤掉不符合条件的数据,减少回表操作。
例如下面这条sql语句:

select * from t where a>10 and a<20 and b='xx'

如果没有索引下推功能,这条语句的执行过程是这样的:

  1. 判断a是否大于10且小于20
  2. 如果步骤1不满足条件,则进行下一条记录。如果步骤1满足条件,则从a的索引树种取得对应的主键进行回表操作
  3. 回表操作取得整行数据,取b的值判断是否等于'xx',如果是,取出数据。重复步骤1和步骤2,直至a大于等于20终止

上面的执行过程中如果满足步骤1的数据有100条,但同时满足t.b='xx'的数据只有10条,数据库却需要回表100次。
引入索引下推后,执行过程如下:

  1. 判断a是否大于10且小于20
  2. 如果步骤1不满足条件,则进行下一条记录。如果步骤1满足条件,则继续判断b是否等于''xx'。如果不满足,则进行下一条记录,如果满足,则从a的索引树中取得对应的主键进行回表操作,取出数据
  3. 重复步骤1和步骤2,直至a大于等于20终止

在引入索引下推后,整个过程只需要回表10次,大大减少了回表操作。