MySQL优化

一. 优化SQL语句的一般步骤(P254)

1. 通过show status命令了解各种SQL的执行频率

MySQL客户端连接成功后,通过show [session | global] status命令可以提供服务器状态信息,也可以在操作系统上使用mysqladmin extented-status命令获得这些信息。show [session | global] status可以根据需要加上参数session或者global来显示session级(当前连接)的统计结果和global级(自数据库上次启动至今)的统计结果。

show status like ‘Com_%’;

Com_xxx表示每个xxx语句执行的次数。其中insert操作,批量插入的insert操作只累加一次。

 

上面这些参数对于所有的存储引擎的表操作都会进行累计。下面这几个参数只是针对InnoDB存储引擎的,累加的算法也略有不同。

Innodb_rows_read:select查询返回的行数。

Innodb_rows_inserted:执行insert操作插入的行数。

Innodb_rows_updated:执行update操作更新的行数。

Innodb_rows_deleted:执行delete操作删除的行数。

通过以上几个参数,可以很容易的判断出当前数据库的应用是以插入更新为主还是以查询操作为主,以及各种类型的SQL大致的执行比例是多少。对于更新操作的计数,是对执行次数的计数,不论提交还是回滚都会进行累加。

对于事务型的应用,通过Com_commit和Com_rollback可以了解事务提交和回滚的情况,对于回滚操作非常频繁的数据库,可能意味着应用编写存在问题。

Connections:试图连接MySQL服务器的次数

Uptime:服务器工作时间

Slow_queries:慢查询的次数

 

2. 定位执行效率较低的SQL语句

  • 慢查询日志
  • 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时的查看SQL的执行情况,同时对一些锁表操作进行优化。

 

3. 通过EXPLAIN分析低效SQL的执行计划

通过以上步骤查询到效率较低的SQL语句后,可以通过EXPLAIN或者DESC命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。

EXPLAIN中type数据最能反应查询的效率:

ALL;index;range;ref;eq_ref;const,system;null

从左至右,性能由最差到最好

 


 

二. 索引问题

InnoDB不支持Hash索引和RTREE索引。

posted @ 2017-07-08 16:21  TooLateToLearn!  阅读(144)  评论(0编辑  收藏  举报