一、性能分析
1.慢查询日志
Mysql的慢查询日志默认没有开启,需要在mysql配置文件(etc/my.cnf)中配置如下信息: //开启mysql慢查询日志查询开关 slow_query_log=1 //设置慢日志的时间为2秒,SQL语句时间超过2秒,就会视为慢查询,记录慢查询日志 long_query_time=2
2.profile性能分析
show profiles 能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够查看到当前MySQL是否支持profile操作: select @@have_profiling; 默认profiling时关闭的,可以通过set语句在session/global级别开启profiling; Set profiling = 1; 执行一系列的业务SQL的操作,然后通过如下指令查看指令执行的耗时: //查看每一条SQL的耗时基本情况 Show profiles; //查看指定query_id的sql语句各个阶段的耗时情况 Show profile for query query_id //查看指定query_id的SQL语句CPU的使用情况 Show profile cpu for query query_id
3.explain执行计划
Explain 或者desc 命令获取mysql如何执行select语句的信息,包括在select语句执行过程中表如何连接和连接的顺序。 语法: Explain sql语句 Explain执行计划各字段含义: 1)Id select查询的序列号,表示查询中执行select子句或者操作表的顺序(id相同,执行顺序从上到下,id不同,值越大,越先执行) 2)Select_type 表示select类型,常见的取值有simple(简单表,不使用表连接或者子查询)、p’rimary(主查询,即外层的查询)、union(union中的第二个或者后面的查询语句)subquery(子查询)等 3)Type 表示连接类型,性能由好到差的连接类型为null(select ‘A’)、system、const(根据主键查询)、eq_ref、ref、ranger、index(根据索引,但是会遍历整个索引)、all(全表,需要优化). 4)Possible_keys 可能使用到的索引,一个或者多个 5)Key 实际使用的索引,如果为null则表示没有使用 6)Key_len 表示索引中使用的字节数,该值为索引字段最大的可能长度,并非实际使用长度,在不损失精确度的情况下,长度越短越好 7)Rows Mysql认为必须要执行查询的行数,在innodb中,是一个估算值,可能并不准确 8)Filtered 表示返回的行数占需读取行数的百分比,filtered的值越大越好
4.索引的使用
1)最左前缀法则 如果索引了多列(联合索引),要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效(后面的字段索引失效) 2)范围查询 联合索引中,出现范围查询(>,<)范围查询右侧的列索引失效,可用(>=,<=)优化 3)索引列运算 不要在索引列上进行运算操作,索引将会失效 4)字符串不加引号 字符串不加单引号会导致索引失效 5)模糊查询 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效 6)Or连接的条件 用or分割开的条件,如果or前面的条件中的列有索引,而后面的列中没有索引,那么涉及到的索引都不会使用到 7)数据分布影响 如果mysql评估使用索引比全表查询慢,则不使用索引 8)SQL提示 SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的 Use index: Ignore index:
Force index:
9)覆盖索引 尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *.
Using index condition:查找使用了索引,但是需要回表查询数据 Using where;using index:查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 10)前缀索引 当字段类型为字符串(varchar,text等)时,有时候需要索引很长的字符串,这会让索引变的很大,查询时,浪费大量的磁盘io,影响查询效率。此时可以只将字符串的一部分前缀,建立索引,这样可以大大节省索引空间,从而提高索引效率。 语法: Create index idx_XXXX on table(column(n)); 前缀长度: 可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值,索引选择性越高则查询效率越高,唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的
5.索引设计原则
1)针对数据量比较大,且查询比较频繁的表建立索引 2)针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引 3)尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高(例如性别不建议建立索引) 4)如果是字符串类型的字段,字符的长度较长,可以针对于字段的特点,建立前缀索引 5)尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率 6)要控制索引的数量,并不是多多益善,索引越多,维护索引结构的代价就越大,会影响增删改的效率 7)如果索引列不存在null值,请在创建表时使用not null约束它,当优化器知道每列是否包含null时,它可以更好的确认那个索引最有效的用于查询
|