本文主要是介绍数据库中索引相关基础知识,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
索引的数据结构
B-Tree: 也称为多路平衡查找树,并且所有叶子节点位于同一层。
B+Tree:它不仅具有 B-Tree 的平衡性,并且可通过顺序访问指针来提高区间查询的性能。
MySQL 索引
索引,在MySQL也称为键 (Key),是存储引擎快速找到记录的一种数据结构 。相当于图书的目录,可根据目录中的页码快速找到所需的内容。
索引结构类型
- B+Tree 索引
- B+Tree 索引是大多数 MySQL 存储引擎的默认索引类型。
- 因为 B+ Tree 的有序性 ,因此可用于部分查找 、 范围查找 、 排序和分组 。
- 适用于全键值、键值范围和键前缀查找,其中键前缀查找只适用于最左前缀查找。若不是按照索引列的顺序进行查找,则无法使用索引。
- Hash 索引
- Hash 索引能以 O(1) 时间进行查找,但是失去了有序性。因此无法用于排序与分组,无法用于部分查找和范围查找,只支持精确查找。
- Hash 索引仅满足 = , IN 和 <=> 查询,不能使用范围查询。因为 Hash 索引比较的是Hash 运算后的 Hash 值,所以它只能用于等值的过滤。
- 全文索引
- 全文索引使用倒排索引实现,它记录着关键词到其所在文档的映射。
- 空间数据索引
索引的优点缺点
- 优点
- 大大减少了服务器需要扫描的数据行数。
- 避免服务器进行排序和分组操作,以避免创建临时表 。
- B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表。将随机 I/O变为顺序 I/O 。
- B+Tree 索引是有序的,会将相邻的数据都存储在一起。
- 缺点
- 索引并不是越多越好,索引固然可以提高相应的 SELECT 的效率,但同时也降低了INSERT及UPDATE 的效率,因为 INSERT 或 UPDATE 时有可能会重建索引 。
索引的设计原则
从索引的优、缺点考虑索引的设计原则。
- 忌过度索引 :
- 索引需要额外的磁盘空间,而且会降低写操作的性能。
- 在修改表内容时,索引会进行更新甚至重构,索引列越多花销时间越长。为此优化检索性能,只保持需要的索引即可。
- 经常用在 排列 、 分组 和 范围搜索 的列适合创建索引,因为索引是有序的。
- 经常出现在 WHERE 子句的列,或是 JOIN 连接子句中指定的列适合创建索引。
- 使用短索引 :
- 若对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
索引的优化策略
- 独立的列:在进行查询时,索引列不能是 表达式 的一部分,也不能是 函数参数,否则无法使用 索引。
- 多列索引: 在需要使用多个列作为条件进行查询时,使用多列索引比使用多个单列索引性能更 好。
- 索引列的顺序:让选择性最强的索引列放在前面。
- 前缀索引:对于 BLOB、TEXT 和 VARCHAR 类型的列,必须使用前缀索引,只索引开始的部分字符。前缀长度的选取需要根据索引选择性来确定。
- 覆盖索引:索引包含所有需要查询的字段的值。具有以下优点:
- 索引通常远小于数据行的大小,只读取索引能大大减少数据访问量。
- 一些存储引擎在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。
索引的使用场景
- 对于非常小的表:大部分情况下简单的全表扫描比建立索引更高效;
- 对于中大型的表: 建立索引非常有效;
- 对于特大型的表:建立和维护索引的代价将会随之增长。这种情况下,需要用到一种技术可以直接区分出需要查询的一组数据,而不是一条记录一条记录地匹配。例如可以使用分区技术。
这篇关于数据库中索引相关基础知识的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!