你好,我是张浩。今天我要跟你分享的内容是:sql调优中的索引设计 作为一个开发,日常的系统运维的过程中,我相信你一定收到过监控系统这样的告警:"生产环境,慢查询数量 1505 ,请及时处理【03:18:09】",亦或是在登录完某个系统之后,初始化数据,加载某个页面,一直在loading...转圈圈,然后产品、业务一直在吐槽,后面查询的优化就出现在了需求分析会上...这些都是我们曾经碰到过的问题,当发生这些问题之后,我们通常会考虑Sql调优。 在回答这个问题之前,可以问一下自己,如何进行调优,我相信你自己也能说出来几点,比如:加索引、数据类型的优化、表设计的优化...等等 其中2、3、4是与我们最息息相关的,在接下来的文章系列中,将会着重的去介绍 我们写完一条sql或者设计完表之后,怎么知道在自己的sql语句写的好还是不好?这里一般通过mysql的执行计划来判断。 当客户端发送给mysql服务器一条查询语句之后,经过sql的优化器,会产生一个执行计划,从而知道mysql是如何处理你的sql语句的,分析你的查询语句或是表结构的性能瓶颈,使用explain关键字,它的语法是:Explain + sql type字段表示表的连接类型:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/const,range 之下基本都可以进行调优,所以当我们在设计完索引的时候,需要看一下自己sql的执行计划,是不是有进行调优的空间,其中: all : 全表扫描
index : 索引全扫描
range : 索引范围扫描,常用语<,<=,>=,between,in等操作
ref : 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref : 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system : 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null : MySQL不访问任何表或索引,直接返回结果
有的同学反馈了,我索引明明建完了,为什么我的执行计划还是all,还是会出现慢查询?其实这里面存在索引失效的情况,比如:
2、组合索引前的索引列使用范围查询(< >、like) 这些都是我们在日常写sql语句或者设计索引的过程中,需要警惕和注意的。有的同学要问了,什么是"组合索引",下面一篇文章,我们将介绍:组合索引、主键索引、唯一索引、普通索引、全文索引、多列索引、回表、索引覆盖、索引下推 等一系列相关的名词和开发过程中的使用情况 留几个问题:1、索引的本质是什么?2、索引采用的数据结构为什么是B+树?二叉树、B树不行吗?