美文网首页
MySQL性能调优(三)Query优化--基本思路

MySQL性能调优(三)Query优化--基本思路

作者: chanyi | 来源:发表于2020-03-23 14:50 被阅读0次

1、Query优化的基本思路

1、定位Query
2、explain分析Query
3、profiling查看Query的性能瓶颈

具体操作(MySQL性能调优(四)Query优化--explain Query和profiling Query

2、Query优化的基本原则

(1)、高并发和高消耗中,优先考虑高并发的Query优化
首先高并发的Query如果不优化造成的破坏更严重
其次高并发Query优化受益更高,更有效降低单位时间的IO操作
最后对减少mysql服务器的CPU消耗更有效

(2)、使用小结果集驱动大结果集
减少嵌套循环中循环的次数,从而减少IO总量和CPU运算次数

(3)、尽可能在索引中完成排序
索引的本质就是排序
InnoDB存储引擎,每张表都有一个聚集索引(唯一一个,因为表数据的物理顺序只有一个),聚集索引一般为主键或者自定义的唯一不为空的索引,如果没有定义,存储引擎会隐式的定义一个6字节的rowid主键来作为聚集索引。因为表的存储顺序就是按照聚集索引存储的,如果按照聚集索引排序,那么筛选出来的顺序本身就是有顺序的。不用再次排序。

(4)、只取出自己需要的columns
mysql中存在两种排序算法:
算法一:4.1版本以前的算法,实现方式是先只筛选出需要排序的字段和指向对应行数据的指正,然后按照一定顺序在排序区(大小可通过参数:sort_buffer_size设定)中进行排序,排位序之后,更具指针获取到完整的行数据
算法二:4.2版本之后的算法,实现方式是筛选出满足条件的行的所有字段信息,然后再排序区内完成排序
区别是:算法一占用排序区的空间小,但是需要两次数据的访问,取出最终数据。第二种算法占用排序区空间大,但是效率高,只需要一次的数据访问即可得出最终数据。
现在所使用的的是第二种算法,所以取出多余的column会占用更多的排序区空间。

(5)、使用最有效的过滤条件
从性能来看,并不是where语句中的过滤条件越多效果就越好。where语句最好使用索引,多个索引的情况下最好使用最短的索引查询,因为索引占用的空间越大,访问索引所需要的读取的数据量就会越大,从而影响性能

(6)、尽可能避免复杂的jion和子查询
join和子查询中所涉及到的表越多,在MyISAM存储引擎中,会触发表锁,在并发的情况下会严重影响性能。InnoDB存储引擎实现了行数,性能相对要高一些。在某些情况下,甚至可以将join语句分成多个简单query执行,虽然增加了请求次数,但是减少了阻塞的概率。具体情况具体分析。

3、索引的状态查看

使用此命令来查看索引的使用情况:

 show session status like 'Handler_read%';

返回信息:

Handler_read%
Handler_read_first:索引中第一条被读的次数,表示Query语句在做全索引表扫描,此项值不能太大,应用如果做一次全索引表扫描也是比较费时间的。
Handler_read_key:基于索引读取行的次数,此项值越高,说明索引的利用率越高。
Handler_read_last:访问索引的最后一条数据作为定位,用于ORDER BY DESC 索引扫描避免排序
Handler_read_next:按键顺序读取下一行的请求数。如果要查询具有范围约束的索引列或进行索引扫描,则此值将增加
Handler_read_prev:按键顺序读取上一行的请求数。该读取方法主要用于优化ORDER BY…DESC
Handler_read_rnd:基于固定位置读取行的请求数。如果您正在执行大量需要对结果进行排序的查询,则此值很高。可能有很多查询需要MySQL扫描整个表,或者有一些连接没有正确使用键
Handler_read_rnd_next:读取数据文件下一行的请求数。如果要进行大量表扫描,则此值较高。通常,这表明您的表未正确建立索引,或者未编写查询以利用您拥有的索引,所以此行数字越小越好

参考资料:
1、《MySQL性能调优与架构设计》
2、https://blog.csdn.net/shujujiangtang/article/details/79970261
3、https://www.cnblogs.com/zengkefu/p/5685811.html

相关文章

网友评论

      本文标题:MySQL性能调优(三)Query优化--基本思路

      本文链接:https://www.haomeiwen.com/subject/evvjyhtx.html