对于许多Java从业者来说,MySQL的性能优化一直是大难题。无论是跳槽面试,还是日常的业务开发,你总会遇到这样那样的数据库性能瓶颈。这时候除了常见的分库分表外,还有哪些方式可以优雅的帮助我们进行数据库的性能优化呢。
MySQL性能优化实战-开课吧广场6月1日的《HelloWorld公开课》,开课吧Java进阶课教学教研负责人,灭霸詹手把手教你如何进行MySQL的性能优化,让你不再为数据库性能瓶颈发愁。
MySQL性能优化思路
相信每个从事Java开发的工程师都能或多或少的说出几条数据库的优化方法,下面我们列举了集中常见的优化思路,相信其中一点有你熟悉的方法。
首先需要使用功能,去获取所有查询时间比较长的SQL语句
查看执行计划,查看有问题的SQL的执行计划
针对查询慢的SQL语句进行优化
使用查看有问题的SQL的性能使用情况
调整操作系统参数优化
升级服务器硬件
慢查询日志
在日常开发中,我们经常遇到的一个问题是,虽然知道是MySQL性能瓶颈遇到了问题,但如何才能定位到具体是由于哪些原因导致的呢?幸好MySQL提供了慢查询日志。这个日志会记录所有执行时间超过long_query_time(默认是10s)的SQL及相关的信息。
我们可以通过下面代码临时开启或永久开启慢查询功能,slow_query_log意思是慢查询日志是否开启,slow_query_log_file指明了日志所在的位置。
//临时开启慢查询功能
setglobalslow_query_log=ON;
setgloballong_query_time=1;
//永久开启慢查询功能
slow_query_log=ON
long_query_time=1
查看执行计划
开启了慢查询后,我就可以查看SQL的执行计划了,看看到底是哪里出现了问题,通过EXPLAIN命令,会输出如下结果。
mysqlexplainselect*fromtuserwhereid=2\G
***************************1.row
***************************
id:1
select_type:SIMPLE
table:tuser
partitions:NULL
type:const
possible_keys:PRIMARY
key:PRIMARY
key_len:4
ref:const
rows:1
filtered:.00
Extra:NULL
1rowinset,1warning(0.01sec)
有同学看到上面输出的命令行有点蒙,这些都是什么意思啊,不要着急,我们一个一个命令来看
id:SELECT查询的标识符每个SELECT都会自动分配一个唯一的标识符
select_type:SELECT查询的类型table:查询的是哪个表
partitions:匹配的分区
type:join类型
possible_keys:此次查询中可能选用的索引
key:此次查询中确切使用到的索引
ref:哪个字段或常数与key一起被使用
rows:显示此查询一共扫描了多少行.这个是一个估计值
filtered:表示此查询条件所过滤的数据的百分比
extra:额外的信息