一、索引是什么?
索引是存储引擎用于快速找到记录的一种数据结构。存储引擎首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。
比如, select first_name from actor where actor.id=5;
mysql先在索引上按值进行查找,然后返回所有包含该值的数据行。
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据。
二、索引的优势和劣势?
优势
1) 类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
2) 通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
劣势
1) 实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的。
2) 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为在更新表时,MySQL 不仅要保存数据,还要保存一下因为每次更新时所添加的索引列字段的文件,都会调整因为更新所带来的键值变化后的索引信息。
三、索引结构
mysql中常用的索引类型包括BTree索引、B+Tree索引、HASH索引。在介绍索引的使用和索引的优点之前,需要先了解清楚索引擎。
索引 | InnoDB引擎 | Memory引擎 |
---|---|---|
BTree索引 | 支持 | 支持 |
B+Tree索引 | 不支持 | 不支持 |
HASH索引 | 不支持 | 不支持 |
Full-text索引 | 5.6版本之后 | 不支持 |
mySQL常用的索引,都是指B+树(多路搜索树)结构组织的索引。其中聚焦索引、复合索引、前缀索引、唯一索引默认都是使用B+tree树索引,统称为索引。
3.1 BTree
5叉BTree中每个节点最多包含5个孩子
除根节点和叶子节点外,每个节点至少有3个孩子
若根节点不是叶子节点,则至少有2个孩子
所有叶子节点由n个元素,n+1个指针
BTree跟二叉树相比,查询效率更高,因为对于相同的数据量来说,5叉BTree只需要查3个层级结构。
3.2 B+Tree
B+Tree与BTree区别
5叉B+Tree最多含有5个key,而BT人最多只有4个key
B+Tree的叶子节点保存所有key信息,按照key大小顺序排列
所有非叶子节点都可以看作是key的索引部分
3叉B+树.png
四、索引设计原则
应该建立索引的列
- 在经常需要搜索的列上,可以加快搜索的速度;
- 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
- 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
- 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
- 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
- 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
不应该建立索引的列
- 对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
- 对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
- 对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
- 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
网友评论