MySQL实战(三)索引简介

一、什么是索引

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。

索引按照不同的维度分为:

数据结构 B+树,Hash索引,R-Tree等
存储层面 聚簇索引、非聚簇索引
逻辑层面 主键索引、普通索引、复合索引、唯一索引、全文索引等

1、什么是B+树

    二叉查询树:任意节点,它的左子树如果不为空,那么左子树上所有节点的值都小于根节点的值;任意节点,他的右子树如果不为空,那么右子树上的所有节点的值大于根节点的值。优点是:查询带来很高的性能。缺点:极端情况下只有左子树或又子树。

    平衡二叉树:二叉平衡树要求节点的左右子树的高度不要相差超过1。

B+树有几个特点:
1)是多叉而不是二叉了,使用多叉的目的是降低树的高度;
2)每个节点不再只是存储一个key了,可以存储多个key;
3)非叶子节点存储key,叶子节点存储key和数据。
4)叶子节点两两相连,为顺序查询提供了帮助

2、mysql选择B+树的原因:

1)B+树的非叶子节点只是存储key,占用空间非常小,因此每一层的节点能索引到的数据范围更加的广。

2)叶子节点两两相连,符合磁盘的预读特性。

3)支持范围查询,而且部分范围查询非常高效。

3、Innodb表下的索引

1) InnoDB下,表都是根据主键顺序以索引的形式存放的,这种数据存储方式也被称为聚簇索引,“聚簇”就是表示数据行和相邻的键值紧凑的存储在一起,也就是数据行实际上是存储在索引的叶子页中。

2)非聚集索引

和主键索引不同,非聚集索引的叶子节点存储了列的值和对应记录的主键的值,按照辅助索引来查询数据的时候,如果没有用到覆盖索引,先从辅助索引文件中获取到数据对应的主键,根据主键从聚集索引中获取真实数据。

在InnoDB中,如果没有定义主键,会选择一个唯一的非空索引代替。如果没有这样的索引,那么他会隐式的定义一个主键来作为聚簇索引。所以无论是否设置主键,InnoDB还是会帮你满足以上图的形式来索引数据。

4、MyISAM索引

MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,这种称为非聚集索引。MyISAM在索引层和压缩层的卓越贡献,所以经常把myisam用于slave层,供客户端去读取。而myisam在写库操作的时候会产生排他锁,如果写操作一直占用的话,那么其他连接请求一直就处于等待中,从而造成堵塞,甚至能把服务器dang掉。

两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。

5、磁盘IO与预读

计算机进行一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,称之为页。页的大小和操作系统关联,一般为4K或者8K。所以,B+树的优势还和IO读写有关。

6、建立索引的几大原则

1)最左前缀匹配原则,复合索引遵守「最左前缀」原则,查询条件中,使用了复合索引前面的字段,索引才会被使用。

2)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序。

3)尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例。

4)索引列不能参与计算,保持列“干净”,否则将导致索引失效而进行全表扫描。

5)尽量的扩展索引,不要新建索引。

6)只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

7)like语句,在like “value%”可以使用索引,但是like “%value%”不会使用索引,走的是全表扫描。

 

你可能感兴趣的:(MySQL进阶)