今天开启mysql学习专栏,一来记录自己学习情况,二来也是方便与大家交流。一起探讨,一起成长;
不管实际项目开发过程中还是面试mysql相关知识,我认为mysql性能调优都是一个重要的知识点。
我将主要从以下几个方面来进行阐述。首先如何查看自己的项目中是否存在mysql查询的情况,只要这样才能去优化。我们可以打开mysql开启配置项,查看哪些mysql执行及最大执行时间
下面两个指令可以查询
show variables like 'slow_query%';
show variables like 'long_query_time';
如果没有开启则可以通过以下mysql的指令进行开启
set global slow_query_log = 'ON'; // 开启慢sql的查询日志
set global slow_query_log_file = '/vars/lib/mysql/log'; // 记录日志的地址
set global slow_query_time = 1; // 最大执行时间
除此之外,许多的数据库连接池中间件都会记录慢mysql查询的语句
有了mysql分析的地方,并且方便我们查看之后,就可以进行对应优化了。不管是之前写的sql不严谨还是测试环境与生产环境不同,数据量级不一致,导致后来业务量增加数据查询等都会出现性能瓶颈;
我将从以下几方面思路来进行mysql的性能优化‘
1、是否加索引
尽量避免select * 这样查询全部字段的操作,尽量避免回表查询(比如建立联合索引可以解决),因为根据mysql的存储引擎特点,innoDB存储引擎索引采用B+树结构,叶子节点存储的是主键及对应的行信息,普通索引也叫非聚簇索引存储的是主键,需要需要查询相关字段还要回表进行查询。
其中回表查询是什么,以及如果避免回表查询是很重要的知识点,面试当中也很喜欢提问这类问题
2、锁等待
因为mysql之前的版本默认存储引擎是myISAM,该引擎不支持行级锁,支持表级锁,锁的粒度还是比较大的,而mysql之后的版本当中默认采用的是innoDB存储引擎,它支持表级锁和行级索,行级索的粒度更细,更能满足并发事务的执行。如果更新sql语句的时候,给一张表加表级锁,那么其他的操作(包括查询)就得等待这个操作完成,这样锁等待将会导致效率低下。
3、不恰当的SQL语句
这里列举几种常见的几种情况,比如查询很少字段也习惯使用select *,针对大数据的表采用分页查询limit<M,N>,对为设置索引的字段进行排序按照等等都可以优化
具体如何查询SQL执行计划,可以使用explain来查看自己SQL的执行计划。重点关注以下信息包括type至少是ref级别的,范围查询至少是range级别的。key表示使用的索引,rows代表查询检索的行数,extra附加信息,包括是否使用了覆盖索引等信息
更进一步如果想查看mysql的内核执行情况,可以使用show profile来查看
针对以上列出不恰当的查询sql可以进行优化
3.1、比如针对select * 的,可以只查询自己需要的字段,或者查询条件是索引最好是主键。如果查询字段列值比较少,可以建立联合索引
3.2、大数据表的分页查询优化,可以采用拆分的思路,也就是将一个查询分为两个子查询,其中子查询用到主键排查一些信息这样思路去优化。
以上就是今天关于mysql性能优化的几点记录。