是基于关系型数据库,一种独立的、物理的对表中一列或多列进行排序的存储结构
查询表数据的两种方式:
方式一:全表查询,根据返回结果匹配条件获取目标数据,造成大量I/O操作
方式二:根据索引查询目标数据,减少查询时间
索引的数据结构(默认的索引类型为B+树):
hash表:
只有等值查询的场景
有序数组:
对于范围查找优势明显,可以使用二分查找,但存储数据时涉及到数组存储,效率很慢,只适用于静态存储引擎
二叉树:
根据叶子节点的内容,可以将索引分为主键索引和非主键索引;
主键索引的叶子节点是行数据,主键索引也称为聚合索引;
非主键索引的叶子节点存储的是主键值,也称为二级索引,需要再次回表查询;
索引优点:
- 减少读取时间
- 增加唯一索引,保证表中每一行数据唯一性
- 加速表与表之间的连接
- 减少分组排序函数的时间
索引缺点:
- 增加物理内存
- 当对表数据进行修改时,需动态的维护索引,增加数据库操作时间
使用索引的原则:
- 对于频繁操作的列数据避免使用索引
- 避免大量使用索引,索引越多,数据修改时间越长
- 对于数据不重复比例高的列使用索引
- 对于频繁进行分组排序的列使用索引
- 删除不再使用的索引或很少使用的索引
索引失效的几种情况:
- or关键字需全部是索引字段
- 联合索引未按使用左侧索引字段
- like已%开头的模糊查询
- 需要类型转换
- 索引当作条件进行类型转换、运算、使用函数
索引分类:
普通索引:最基本的索引类型
唯一索引(unique):不允许人核两行有相同索引值的索引
主键索引:唯一索引的特定类型
聚合索引:
表中行的物理顺序与索引的顺序一致。一张表只能包含一个聚集索引。可以提高更快的访问速度
非聚合索引:
表中哼的物理顺序与索引的顺序可以不相同。一张表可以包含多个非聚集索引。
聚集索引与非聚集索引的区别:
聚集索引一张表只能包含一个,索引顺序需要与表中行的物理顺序一致。聚集索引的索引建在叶子节点,即叶子节点直接存储数据内存地址,可以提供更快的访问速度。但非聚簇索引叶子节点只存储数据ID,所以当非聚簇索引查询到目标数据ID后,需要回表查询。聚簇索引一般为主键索引
聚簇索引和非聚簇索引到底有什么区别?_Linux小百科的博客-CSDN博客_聚簇索引和非聚簇索引的区别
hash索引和B+树索引的区别:
hash索引是将整行数据进行hash操作,获取hash值当做key,行数据当作value存储到hash表中。
建立hash索引语句:create index idx_id_hash using hash on emp_test(id);
hash索引优缺点:
一般用于精确查找,比如=,in,!=,而不能做范围查找。
不能利用部分索引键查询,不能避免全表扫描。
可能存在大量hash值相同的情况,性能降低。
B+树索将数据存储到叶子节点,根节点只存储索引,这样就会使在相同树高的情况下,可以存储的索引数更多,减少I/O查询。同时,B+树的叶子节点是链表形式,这样可以更快速的查询范围,因为只需要查询范围两端的节点,再遍历链表即可。同时叶子节点存储数据这样只需要查找叶子节点数据可以更快速的全表搜索。
覆盖索引:
根据查询字段均建有索引,无需再次查询即可得出目标数据称为覆盖索引。
最左匹配原则:
当建立联合索引时(例如建立索引A,B,其实是建立了索引A 和索引A,B,所以无需单独建立索引A)
对于生成的索引树是,会先按照A进行排序,当A相同时,再按照B进行排序,所以,当A和B联合查询时可以使用索引,而当B单独查询时,索引是失效的。