当用户报告说你的应用程序太慢。在确定不存在物理系统资源瓶颈之后,就应该把注意力转向MySQL数据库(当用MySQL作为数据库)。优化的顺序:查看慢查询日志,日志里查询超过10秒的说明查询出问题-------->通过explain定位这条语句哪里有问题-------->通过方案对问题点进行优化,如加索引
一、寻找运行缓慢的SQL语句
cmd运行登录mysql,并输入命令:show full processlist;,如下图,显示当前所有数据库线程的运行结果,其中Time是以秒来算的,state代表线程运行的一个状态,info代表正在执行的操作,通过state可以得出当前线程正处于哪个阶段,这里做一个耗时很久的测试,这里对employee表循环50000次插入数据,并观察此时这个线程的状态:
在插入过程中执行命令: show full processlist;看出当前线程正处于query end状态,说明此线程正处于一个“异常状态”,实际上此时还在插入中;当出现大量不正常状态的线程,说明这些线程的操作需要优化了。
附上mysql线程状态的说明:http://blog.itpub.net/22664653/viewspace-754715/
二、确认低效查询
1、生成一个查询执行计划(QEP),在执行SQL前,在语句前添加 EXPLAN ,在末尾添加 \G,让结果垂直显示,如图,其中key列显示查询时使用的索引,如果为null,证明该语句需要调优;rows是受影响的行数,这个与查询所需的执行时间是直接相关的;由于这是单表查询,这个语句会被理解为对整个表进行扫描,并返回结果
如果指定了主键,在查询的时候索引就是主键了,当前employee表的主键是id,以下是搜索出来的结果:
2、常用命令
查看但前表的索引:show index from 表名
查看但前表的结构:show table status like '表名',这里需要注意:不同的引擎,出来的结果是不一样的,例如,如果使用MyISAM、MEMORY、ARCHIVE或者BLACKHOLE存储引擎,那么行的长度和行数都是精确值。如果是InnoDB存储引擎,结果都是估计值,会存在误差,如图:
查看当前服务器的内部状态信息,了解各种sql的执行频率:show global/session status,global表示自数据库启用至今,session:(默认)表示当前链接,
如: mysql>show status;
mysql>show global status;
mysql>show status like "Com_%";
mysql>show global status like "Com_%";
参数说明:
Com_select 执行select操作的次数,一次查询值累计加1
Com_update 执行update操作的次数
Com_insert 执行insert操作的次数
Com_delete 执行delete操作的次数
只针对Innodb引擎的:
InnoDB_rows_read执行select操作的次数
InnoDB_rows_update执行update操作的次数
InnoDB_rows_insert执行insert操作的次数
InnoDB_rows_delete执行delete操作的次数
其他:
connections链接mysql的数量
Uptime服务器已经工作的秒数
Slow_queries慢查询的次数
查看MySql系统变量的当前值:show global/session variables