索引太多,应用程序的性能会下降。索引太多,查询性能下降。
概述
InnoDB存储引擎支持以下索引:
B+树索引,全文索引,哈希索引。
数据结构与算法
二分查找法
二叉查找树和平衡二叉树
B+树
B+树索引
B+树高度一般2-4层。
聚集索引
通过主键构建一颗B+树。数据页之间双向链表连接。
数据页上存放的是完整行记录。索引页中存放的是键值和指向数据页的偏移量。
聚集索引的存储不是物理上连续的,而是逻辑上连续的。
范围查询:查找主键某一范围内的数据,通过叶子节点的上层中间节点(目录项记录)可得到页的范围。
辅助索引
辅助索引的叶子节点中包含键值(该列值)还有书签(主键即聚集索引)。
回表可得到一个完整的行记录。
B+树分裂
如果所在的数据页已经满了,根据B+树的算法,这时候需要申请一个新的 数据页,然后挪动部分数据过去。这个过程称为页分裂。
B+树分裂并不总是从中间记录开始。
要通过插入的顺序信息来决定是向左还是向右进行分裂,决定分裂点记录是哪一个。
Cardinality值
该值表示索引中不重复记录数量的预估值。
通过采样方法来完成。
联合索引
对表上多个列进行索引。多字段组成联合索引,但是要符合最左匹配原则要求。
覆盖索引
如果辅助索引上已经存在我们需要的数据,那么引擎就不会去主键上去搜索数据了。 ---- 这个就是所谓的"**覆盖索引**"
如果使用覆盖索引就可以不回表扫描。
优化器是否选择使用索引
要莫全表扫描。
自适应哈希索引
哈希表这种结构适用于只有等值查询的场景。
基于哈希表的方式实现
MySQL的B+树索引和hash索引的区别 - 好名字啊。 - 博客园
全文检索(全文索引)
全文检索(采用倒排索引实现)是基于数据库中的整本书或整篇文章中的任意内容信息查找出来的技术。
、
补:
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构
MyISAM 与 InnoDB的索引对比
对于数据库的表而言,索引其实就是它的“目录”。