索引(Index)是帮助MySQL高效获取数据的数据结构。咱们能够简单理解为:索引的目的在于提升查询效率。html
索引的数据结构是B+树,原理图以下
mysql
关于B+树的详细介绍,能够参见文章下面的参考。sql
精简描述:B+树是为了磁盘或其余直接存储辅助设备设计的一种平衡查找树。在B+树中,全部记录节点都是按键值的大小顺序存放在叶子节点上,各叶子节点直接由指针进行链接。数据结构
B+树中的B不是表明二叉(binary),而是表明平衡(balance),由于B+树是从最先的平衡二叉树演化而来,可是B+树不是一个二叉树。性能
索引的内部也是一张表,索引组织表,索引的构建须要使用到磁盘空间跟内存空间,并非索引越多越好,太多反而致使性能降低,建议一张表最多不要超过8个索引。优化
下面的分类维度没有标准,但通常索引咱们会比较关注汇集索引跟非汇集索引。设计
汇集索引(clustered index)是按照每张表的主键构造一棵B+树,同时叶子节点中存放的即为整张表的行记录数据,也将汇集索引的叶子节点称为数据页。指针
因为实际的数据页只能按照一棵B+树进行排序,所以每张表只能拥有一个汇集索引。htm
主键是一个汇集索引,若是在InnoDB没有定义主键,那么默认生成一个rowId做为汇集索引。blog
非汇集索引(Secondary Index,也称辅助索引),叶子节点并不包含行记录的所有数据。叶子节点除了包含键值之外,每一个叶子节点中的索引行中还包含了一个书签(bookmark)。该书签用来告诉InnoDB存储引擎哪里能够找到与索引相对应的行数据。
当经过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并经过叶级别的指针得到指向主键索引的主键,而后再经过主键索引来找到一个完整的行记录。
从辅助索引中就能够获得查询的记录,而不须要查询汇集索引中的记录。
使用覆盖索引的好处是辅助索引不包括整行记录中的全部信息,能够减小IO操做。
不容许具备索引值相同的行,从而禁止重复的索引或键值。
联合索引是指对表上的多个列进行索引。从本质上来讲,联合索引也是一颗B+树,不一样的是联合索引的键值的数量不是1,而是大于等于2。
索引匹配的原则是最左匹配原则,MySQL会一直向右匹配直到遇到范围查询(>、<、between、like)就中止匹配。
如创建了索引(a,b,c),那么这些条件语句是能够走到这个索引的,“a=1 and b = 2 and c > 3”、“a=1 and b = 2”,但“b > 1 and d = 10”就没有走到这个索引了,第一个命中的必须是“a”。
count(distinct colname)/count(colname) ->1,尽可能将选择性高的列放在索引的最前面,可是也存在例外状况。
典型的例子如性别,通常是不建索引的。
额外存储,特殊处理;
使索引统计和值更加复杂;
SQL执行结果不符合预期
select id,value from tab where id+10=15 (x)
将多个字段创建一个组合索引
一个索引能够被多个query利用
减小索引数量,消除重复索引
避免使用NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等
使用EXPLAIN关键字能够模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。
通常重点看type、key、rows。
type:表示表的链接类型。经常使用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
key:表示实际使用的索引
rows:扫描出的行数(估算的行数),通常这个值越小越好
索引是否具备高选择性,通常就能够看Cardinality值。
能够经过“SHOW INDEX FROM table”结果中的列Cardinality来观察,这是一个预估的值,而不是一个准确的值,是经过采样获得的数据。
Cardinality/总条数越接近1,越有必要建索引。
MySQL 查询优化器的主要功能是完成SELECT语句的执行,在保证SELECT语句正确执行以外,还有一个重要的功能,就是使用关系代数、启发式规则、代价估值模型等不一样种类的技术,提升SELECT语句的执行效率。
这部分是MySQL实现的,可让咱们的SQL写得更“随意”。
官方文档mysql-index https://dev.mysql.com/doc/refman/5.6/en/mysql-indexes.html
官方文档汇集索引与辅助索引 https://dev.mysql.com/doc/refman/5.6/en/innodb-index-types.html
姜承饶 《MySQL技术内幕:InnoDB存储引擎》
MySQL索引原理及慢查询优化 https://tech.meituan.com/2014/06/30/mysql-index.html
深刻理解什么是B+树 https://cloud.tencent.com/developer/article/1425602
BTree和B+Tree详解 http://www.javashuo.com/article/p-pzosgihq-dz.html
Hollis关于Explain的讲解 https://mp.weixin.qq.com/s/OpS_F5lG9CaFw4xqnofWLw
MySQL查询优化器 https://yq.aliyun.com/articles/680912