通过show status命令了解各种SQL的执行效率
MySQL客户端连接成功之后,通过show[session|global]status命令可以提供服务器状态信息,也可以在操作系统上使用mysqladmin extended-status命令获得这些消息。show[session|global]status可以根据需要加上参数"session"或"global"来显示session级(当期连接)的统计结果和global级(自数据库上次启动至今)的统计结果。如果不写,默认使用的参数是"session"
定位执行效率较低的SQL语句
可以通过以下两种方式定位执行效率较低的SQL语句
- 通过慢查询日志定位那些执行效率较低的SQL语句,用–log-slow-queries[=file_name]选项启动时,mysqld写一个包含所有执行时间超过long_query_time秒的SQL语句的日志文件
- 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看SQL的执行情况,同时对一些锁表操作进行优化
通过EXPLAIN分析低效SQL的执行计划
通过以上步骤查询到低效率的SQL语句后,可以通过EXPLAIN或DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序
MySQL4.1开始引入了explain extended命令,通过explain extended加上show warnings,我们能够看到在SQL真正被执行之前优化器做了哪些SQL改写
在遇到复杂的SQL的时候,我们可以利用explain extended的结果来迅速的获取一个更清晰易读的SQL
MySQL5.1开始支持分区功能,同时explain命令也增加了对分区的支持。可以通过explain partitions命令查看SQL所访问的分区
通过show profile分析SQL
MySQL从5.0.37版本开始增加了对show profiles和show profile语句的支持。通过have_profiling参数,能够看到当前MySQL是否支持profile
在获取到最消耗时间的线程状态后,MySQL支持进一步选择all、cpu、block io、context switch、page faults等明细类型来查看MySQL在使用什么资源上耗费了过高的时间
通过trace分析优化器如何选择执行计划
MySQL5.6提供了对SQL的跟踪trace,通过trace文件能够进一步了解为什么优化器选择A执行计划而不选择B执行计划,帮助我们更好地理解优化器的行为