数据库中索引相关基础知识

索引的数据结构

B-Tree: 也称为多路平衡查找树,并且所有叶子节点位于同一层。
B+Tree:它不仅具有 B-Tree 的平衡性,并且可通过顺序访问指针来提高区间查询的性能。

MySQL 索引

索引,在MySQL也称为键 (Key),是存储引擎快速找到记录的一种数据结构 。相当于图书的目录,可根据目录中的页码快速找到所需的内容。

索引结构类型

  1. B+Tree 索引
    • B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
    • 因为 B+ Tree 的有序性 ,因此可用于部分查找 、 范围查找 、 排序和分组 。
    • 适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。若不是按照索引列的顺序进行查找,则无法使用索引。
  2. Hash 索引
    • Hash 索引能以 O(1) 时间进行查找,但是失去了有序性。因此无法用于排序与分组,无法用于部分查找和范围查找,只支持精确查找。
    • Hash 索引仅满足 = , IN 和 <=> 查询,不能使用范围查询。因为 Hash 索引比较的是Hash 运算后的 Hash 值,所以它只能用于等值的过滤。
  3. 全文索引
    • 全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射。
  4. 空间数据索引
    • 空间数据索引会从所有维度来索引数据

索引的优点缺点

  1. 优点
    • 大大减少了服务器需要扫描的数据行数。
    • 避免服务器进行排序和分组操作,以避免创建临时表 。
    • B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表。将随机 I/O变为顺序 I/O 。
    • B+Tree 索引是有序的,会将相邻的数据都存储在一起。
  2. 缺点
    • 索引并不是越多越好,索引固然可以提高相应的 SELECT 的效率,但同时也降低了INSERT及UPDATE 的效率,因为 INSERT 或 UPDATE 时有可能会重建索引 。

索引的设计原则

从索引的优、缺点考虑索引的设计原则。

  1. 忌过度索引 :
    • 索引需要额外的磁盘空间,而且会降低写操作的性能。
    • 在修改表内容时,索引会进行更新甚至重构,索引列越多花销时间越长。为此优化检索性能,只保持需要的索引即可。
    • 经常用在 排列 、 分组 和 范围搜索 的列适合创建索引,因为索引是有序的。
    • 经常出现在 WHERE 子句的列,或是 JOIN 连接子句中指定的列适合创建索引。
  2. 使用短索引 :
    • 若对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间

索引的优化策略

  • 独立的列:在进行查询时,索引列不能是 表达式 的一部分,也不能是 函数参数,否则无法使用 索引。
  • 多列索引: 在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更 好。
  • 索引列的顺序:让选择性最强的索引列放在前面。
  • 前缀索引:对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。前缀长度的选取需要根据索引选择性来确定。
  • 覆盖索引:索引包含所有需要查询的字段的值。具有以下优点:
    • 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。
    • 一些存储引擎在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。

索引的使用场景

  • 对于非常小的表:大部分情况下简单的全表扫描比建立索引更高效;
  • 对于中大型的表: 建立索引非常有效;
  • 对于特大型的表:建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配。例如可以使用分区技术。
posted @ 2021-07-22 13:57  张吱吱  阅读(207)  评论(0编辑  收藏  举报