什么是索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。
索引的作用:目录
数据结构:B+树(查询时间复杂度为logm(N))
为什么索引使用B+树
B+树与B树对比:
(1)B+树比较容易控制高度。mysql限制索引树的高度不能超过3层
(2)B+对所有数据的查询效率是平均的 :B+树只在叶子节点存放数据非叶子点只存放关键字。 但是B树非叶子节点存放的关键字同时又是数据, B树查询效率不平均。
(3)B+树用链表将叶子节点连接起来,适合做范围查询,和排序
查询和排序语句如下:
select * from user where age > 10 and age < 35; 查询
elect * from user order by age; 排序
B+树与其他数据结构进行对比:
数组:需要连续的内存并且查询和排序效率低
链表:查询和排序效率低
二叉树:查询和排序效率低并且可能退化成链表;进行查询操作时范围一次只能缩小1/2;索引从文件中加载内存,io很耗时且一次只加载一个节点。但是B+树一个节点可以存放多个数据;查询时范围一次可以缩小1/m
平衡二叉树:不会退化成链表但是旋转次数很多,索引的结构变化太频繁了;io很耗时,一次只加载一个节点;查询和排序效率低
红黑树:查询和排序效率低;io很耗时,一次只加载一个节点
索引分类
索引创建在表上具体的一个或者是多个属性上面,可分为七类:
主键索引:创建在主键上索引(主键索引是一个特殊的唯一性索引)
辅助索引(普通索引):创建在非主键上的索引
单例索引:创建在一个属性上的索引
多列索引:创建在多个属性上的索引
唯一索引:创建在不重复字段的索引
空间索引:空间属性索引 。
全文索引:建立字符属性上的索引。
只支持CAHR,VARCHAR和TEXT类型的字段上。
聚簇型索引和非聚簇型索引:
两者引擎不同
聚簇型索引(InnoDB):数据文件和索引文件存放在以 .ibd结尾的文件中,B+叶子节点中存放的是数据本身,其中:
主键索引:创建在主键上索引,叶子节点存放就是数据本身且叶子节点上存放的是所有的数据
辅助索引(普通索引):创建在非主键上的索引,叶子节点存放的是数据本身但只存放了创建索引的属性和主键。如果想知道所有的属性,需要通过得到的这个主键再去主键索引树上查询
查询一次得到最终的结果
非聚簇型索引(MyIsam):数据文件和索引文件分别存放在以.myi和 .myd结尾的文件中,B+叶子节点中存放的是数据内存地址,需要根据地址再去查找数据,其中:
主键索引:创建在主键上索引,B+叶子节点存放的是数据内存地址和主键(创建索引的属性),需要根据地址再去找数据。
辅助索引(普通索引):创建在非主键上的索引,B+叶子节点存放的是数据内存地址和创建索引的属性,需要根据地址再去找数据。
查询两次可以得到最终结果