MySQL索引篇
1、定义:
MySQL官方对索引的定义为:“索引是帮助MySQL高效获取数据的数据结构。”可以得到索引的本质是数据结构。可以理解为:索引是帮助MySQL高效获取数据的排好序的数据结构。索引往往以索引文件的形式存储在磁盘上。我们平常所说的索引,如果没有特别说明,都是指B树(多路索引树)结构组织的索引。其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引的默认使用都是B+树索引,当然除了B+树索引外,还有哈希索引等。
2、优劣势:
优势:
- 提高数据检索的效率,降低数据库的IO成本.
- 通过索引树排序,降低数据排序的成本,降低CPU的消耗。
劣势:
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表记录。索引索引也要占用空间。
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行UPDATE、INSERT和DELETE。
- 因为更新表时,MySQL不仅要保存数据,好像更新索引。
- 索引只是提高效率的一个因素。
3、MySQL索引分类
- 单值索引 --即只包含单个列,一个表可以有多个单值索引
- 唯一索引 --索引值必须唯一,但允许有空值
- 复合索引 --即一个索引包含多个列
4、索引的选择
4.1 适合索引的情况:
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其他表关联的字段,外键关系建立索引
- 查询中排序的字段,排序字段若通过索引去访问讲大大提高排序速度
- 查询中统计或者分组字段
4.2不适合索引的情况:
- 表记录太少
- 经常增删改的表,
- 数据重复且分布平均的表字段,如性别。
5、索引的数据结构
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有
Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现
为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大
多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部
分场景,建议选择BTree索引。MyISAM索引文件和数据文件是分离的(非聚集)
-
索引
mysql通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方
式分,InnoDB的索引类型目前只有两种:BTREE(B树)索引和HASH索引。B
树索引是Mysql数据库中使用最频繁的索引类型,基本所有存储引擎都支持
BTree索引。通常我们说的索引不出意外指的就是(B树)索引(实际是用B+树
实现的,因为在查看表索引时,mysql一律打印BTREE,所以简称为B树索引) -
B+tree性质:
1.)n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。
2.)所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指
针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.)所有的非终端结点可以看成是索引部分,结点中仅含其子树中的最大(或最
小)关键字。
4.)B+ 树中,数据对象的插入和删除仅在叶节点上进行。
5.)B+树有2个头指针,一个是树的根节点,一个是最小关键码的叶节点。 -
B-tree
- 叶节点具有相同的深度,叶节点的指针为空
- 所有索引元素不重复
- 节点中的数据索引从左到右递增排列

-
B+树
- •非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问的性能

-
hash表
简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在
mysql中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址
法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成
定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生
Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式
存储。当然这只是简略模拟图。
6、索引的实现
6.1 InnoDB索引实现(聚集)
1. 表数据文件本身就是按B+Tree组织的一个索引结构文件
2. 聚集索引-叶节点包含了完整的数据记录


6.2 MyISAM索引文件和数据文件是分离的(非聚集)


浙公网安备 33010602011771号