一、MySQL 客户端连接成功后,通过 show [session|global]status 命令可以提供服务器状态信息,也可以在操作系统上使用 mysqladmin extended-status 命令获得这些消息。show[session|global] status 可以根据需要加上参数“session”或者“global”来显示 session 级(当前连接)的统计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”。
show status like 'Com_%';
可以用来查看目前的session参数值。
二、定位执行效率较低的SQL语句
1、 通过慢查询日志定位那些执行效率较低的 SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件。具体可以查看本书第 26 章中日志管理的相关部分。
2、 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的执行情况,同时对一些锁表操作进行优化。
3、通过以上步骤查询到效率低的 SQL 语句后,可以通过 EXPLAIN或者 DESC命令获取 MySQL
如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序。通过这步能够查找出表问题所在。
4、经过以上步骤,基本就可以确认问题出现的原因。此时用户可以根据情况采取相应的措
施,进行优化提高执行的效率。
三、主要使用到索引
MyISAM 存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件;InnoDB
存储引擎的表的数据和索引是存储在同一个表空间里面,但可以有多个文件组成。MySQL 中索引的存储类型目前只有两种(BTREE 和 HASH),具体和表的存储引擎相关:MyISAM 和 InnoDB 存储引擎都只支持 BTREE 索引;MEMORY/HEAP 存储引擎可以支持 HASH和 BTREE 索引。
MySQL 目前不支持函数索引,但是能对列的前面某一部分进索引,例如 name 字段,可
以只取 name 的前 4 个字符进行索引,这个特性可以大大缩小索引文件的大小,用户在设计
表结构的时候也可以对文本列根据此特性进行灵活设计。
1)对于创建的多列索引,只要查询的条件中用到了最左边的列,索引一般就会被使用。
(2)对于使用 like 的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用。
(3)如果对大的文本进行搜索,使用全文索引而不用使用 like ‘%…%’。
(4)如果列名是索引,使用 column_name is null 将使用索引。如下例中查询 name 为 null
的记录就用到了索引:
四、存在索引但是不使用索引
(1) 如果 MySQL 估计使用索引比全表扫描更慢,则不使用索引。例如如果列key_part1 均匀分布在 1 和 100 之间,下列查询中使用索引就不是很好:
SELECT * FROM table_name where key_part1 > 1 and key_part1 < 90;
(2) 如果使用 MEMORY/HEAP 表并且 where 条件中不使用“=”进行索引列,那么不会用到索引。heap 表只有在“=”的条件下才会使用索引。
(3) 用 or分割开的条件,如果 or前的条件中的列有索引,而后面的列中没有索引,
(4) 如果不是索引列的第一部分
(5) 如果 like 是以%开始
explain select * from company2 where name like '%3'\G;
(6) 如果列类型是字符串,那么一定记得在 where 条件中把字符常量值用引号引
起来,否则的话即便这个列上有索引,MySQL 也不会用到的,因为,MySQL 默认把输入的
常量值进行转换以后才进行检索。
五、查看索引使用情况
1、如果索引正在工作,Handler_read_key 的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加索引得到的性能改善不高,因为索引并不经常使用。Handler_read_rnd_next 的值高则意味着查询运行低效,并且应该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next 的值较高,则通常说明表索引不正确或写入的查询没有利用索引,
说明索引情况并不是很好。
2、两个简单使用的优化方法
A:定期检查表和分析表
analyze table [tablename]
check table [tablename]
check 也可以用于检查视图是否有错误。
EXample: 建立表,check后发现正确,建立视图,check view 没问题, 删除掉表后,check view 会报错。
B:优化表的语法如下:
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
optimize table [tablename]
但OPTIMIZE TABLE 命令只对 MyISAM、BDB 和 InnoDB 表起作用。
ANALYZE、CHECK、OPTIMIZE 执行期间将对表进行锁定,因此一定注意要在数据库不繁忙的时候执行相关的操作。
常用优化写下一篇。