【mysql索引及优化】一、mysql性能分析及索引

一、性能分析

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时,它可以更好的确认那个索引最有效的用于查询

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值