1 概念:索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。
2 原理及分类:
索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:
先定位到章,然后定位到该章下的一个小节,然后找到页数。
索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,
使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。
优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
劣势:1 索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;
2 索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;
3 构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;
InnoDB索引实现:
表数据本身就是按B+Tree组织的一个索引结构文件
而聚集索引(idb主键索引):叶子节点包含完整的数据记录(节点数据限制保护内存消耗)即所有字段值
idb文件包含表的数据和索引 frm文件存储 表结构的信息数据 (1170个key每页1000个数据)
为什么必须有主键,为何整型递增?隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增
mysql的底层是以b+tree实现的,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。
同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,MySQL会根据其主键
将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)
整型是为了便于顺序查询以及范围查询。如果使用uuid字符串范围比较查询消耗大,存储空间也大(比较又需要asii转化)
对于自身便于做分页以及顺序存放,顺序访问指针提高区间的访问性能(叶子节点存所有字段)
自增ID可以用来做分页优化。如下语句性能相差1000倍:
1. Select * from tbl limit 10000000,30;
2. Select * from tbl where id>10000000 limit 30;
Myslam索引 数据文件和索引文件分离 (非聚集索引)
myi(index)文件 索引字段存储数据 myd文件;表数据 frm表结构定义数据
叶子节点 主键索引存储磁盘文件指针data
磁盘存储原理:寻道时间长,旋转时间短
MySQL支持诸多存储引擎,而存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等,
1、哈希索引:
只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。
2、全文索引:
FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。FULLTEXT可以在创建表的时候创建,也可以在需要的时候用ALTER或者CREATE INDEX来添加:
3、BTree索引
BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h,那么BTree要满足以一下条件:
每个叶子结点的高度一样,等于h;
每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;
叶子结点指针都为null;从左向右递增
非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的磁盘文件指针;
4、B+Tree索引
B+Tree是BTree的一个变种
B+Tree中的非叶子结点不存data,只存储键值key;可以增大度(节点数据存储个数)
B+Tree所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址;
B+Tree的叶节点具有相同高度,顺序访问指针,提高区间访问的性能
提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key。
储引擎在B+Tree的基础上进行了优化,添加了指向相邻叶节点的指针,形成了带有顺序访问指针的B+Tree,这样做是为了提高区间查找的效率,只要找到第一个值那么就可以顺序的查找后面的值