一、概念
索引是对数据库表中一列或多列的值进行排序的一种数据结构,使用索引可以快速的检索数据库中的数据。
二、优点
1、保证数据库表中每一行数据的唯一性
2、加快数据的检索速度
3、加速表和表之间的连接
4、用来排序或者是分组的字段添加索引可以加快分组和排序顺序
三、缺点
1、创建索引和维护索引费时间
2、创建索引和维护索引需要空间成本
3、降低表的增删改的效率,因为每次增删改索引需要进行动态维护,导致时间变长
四、适合建索引的情况
1、数据量大的,经常进行查询操作的表要建立索引。
2、用于排序的字段可以添加索引,用于分组的字段应当视情况看是否需要添加索引。
3、表与表连接用于多表联合查询的约束条件的字段应当建立索引。
参考:https://blog.csdn.net/m0_37925202/article/details/82939530
五、分类
1、从数据结构角度
索引MyISAM引擎InnoDB引擎Memory引擎B-Tree索引支持支持(默认)支持HASH索引不支持不支持支持R-Tree索引支持不支持不支持Full-text索引支持现在支持不支持
参考:
https://blog.csdn.net/qq_22238021/article/details/80918070?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
(1)B+树索引(O(log(n)))
B+树是在B树的基础上改造,它的数据都在叶子节点,同时,叶子节点之间还加了指针形成链表。
附:
二叉查找树:子树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值,且左右子树也分别为二叉排序 树,每个节点上只能存放一个键和数据。
平衡二叉树:左子树和右子树的高度之差的绝对值不超过1,且它的左、右子树都是平衡二叉树,每个节点上只能存放一个键和 数据。
B树:在平衡二叉树的基础上,每个节点上可以存储多个键和数据。
B+树:B+ 树索引的所有数据均存储在叶子节点上,而且数据是按照顺序排列的。B+ 树非叶子节点上是不存储数据的,仅存储 键,而 B 树节点中不仅存储键值,也会存储数据。
参考:http://www.liuzk.com/410.html
(2)hash索引
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
B+树索引和哈希索引的区别:
哈希索引适合等值查询,因为只需一次算法就可找到相应的键值,前提是键值都是唯一的。若不唯一,则需先找到该键所在的位置,然后根据链表向后扫描,直到找到相应的数据。
哈希索引不适合范围查询,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
哈希索引无法利用索引完成排序以及以及like ‘xxx%’ 这样的部分模糊查询。
哈希索引不支持多列联合索引的最左匹配规则。
在有大量重复键值的情况下,哈希索引的效率是极低的,因为存在哈希碰撞问题。
参考:https://www.cnblogs.com/heiming/p/5865101.html
(3)全文索引(FULLTEXT索引)
全文索引(或称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用分词技术等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。
全文索引的类型:自然语言搜索、布尔全文搜索、查询扩展搜索。
(4)空间数据索引(R-Tree索引)
空间数据索引可以用作地理数据存储,从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用 MySQL 的GIS 相关函数来维护数据。
参考:https://xjwblog.com/?p=501
2、从物理存储角度
(1)聚集索引(B+树数据结构)
聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大;
(2)非聚集索引(B+树数据结构)
非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。
3、从逻辑角度
(1)主键索引
在建立主键的时候,数据库会自动为这个主键建立一个索引。
①创建主键索引:
方式一:创建表时建
方式二:ALTER TABLE 表名 ADD PRIMARY KEY ( `列名` );
②删除主键索引:
方式:ALTER TABLE 表名 DROP PRIMARY KEY;
(2)普通索引(或单列索引)
①创建普通索引:
方式一:CREATE INDEX 索引名 ON 表名(字段名(长度));
方式二:ALTER table 表名 ADD INDEX 索引名(字段名);
②删除普通索引:
方式:DROP INDEX 索引名 ON 表名;
(3)多列索引(或复合索引或组合索引)
student表:
①创建多列索引:
方式一:CREATE INDEX 索引名 ON 表名(字段名,字段名);
方式二:ALTER table 表名 ADD INDEX 索引名(字段名,字段名);
②删除多列索引:同删除普通索引一样
(4)唯一索引
①创建唯一索引:
方式一:CREATE UNIQUE INDEX 索引名 ON 表名 (列名);
方式二:ALTER TABLE 表名 ADD UNIQUE 索引名(列名);
②删除唯一索引:同删除普通索引一样
(5)全文索引
创建全文索引:
①方式:alter table 表名 add fulltext 索引名(列名);
②删除全文索引:同删除普通索引一样
参考:https://www.cnblogs.com/blackEyeProgram/p/12824466.html