索引介绍
索引是数据库中用于提高查询效率的一种数据结构,它可以使得数据库的查询速度更快。通过索引可以快速定位到包含要查询数据的数据块,从而提高查询效率;是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现。在数据库中,索引是建立在一个或多个表的列上的,常见的索引类型包括B-tree索引、哈希索引、全文索引等。
B-tree索引是MySQL中最常用的索引类型,它是一种树形结构的索引,每个节点可以包含多个子节点,每个节点的子节点数都有一个上限。B-tree索引可以实现快速的查找、插入和删除操作,同时对于范围查询也有较好的支持。
哈希索引则是一种散列表的形式,通过哈希函数将索引列的值映射到一个哈希值上,然后将哈希值和对应行的指针存储在哈希表中。哈希索引可以实现快速的等值查询,但是对于范围查询、模糊查询等操作效率不高。
全文索引则是针对文本类型的数据建立的索引,可以快速实现文本内容的搜索。
在实际应用中,我们需要根据具体的业务需求选择合适的索引类型,并合理地设计索引,避免过多或者不必要的索引造成的性能影响。
索引特征
MySQL索引是一种数据结构,它存储了一个表中的某一列数据的值并指向它们的物理存储位置。索引可大大提高查询数据的效率,降低系统的I/O负载,但也有其优缺点:
优点:
缺点:
因此,应当权衡优缺点,在必要的数据列上应建立适当的索引,不过度使用索引以避免出现低效的场景。
索引类型
MySQL支持多种不同类型的索引,下面是一些常用的索引类型:
B-tree 索引:B-tree是MySQL中默认使用的索引类型。它在查询方面性能良好,可用于高效地查找等值、范围和存储排序数据。
哈希索引:哈希索引建立在哈希表上,通过哈希算法将每行数据转为一个哈希值,在哈希表中查找该哈希值所在的位置,以此找到对应行数据。它适用于等值匹配的查询,但不支持范围查询和排序操作。Memory存储引擎支持显式hash索引,InnoDB和MyISAM存储引擎不支持;适用场景:只支持等值比较查询,包括=, <=>, IN()
全文索引:用于对文本内容的全文搜索,它允许查询含有某些特定字符串或词语的所有行。
空间索引:处理空间数据的索引类型,可以用于更加有效地查询地理位置坐标等数据类型。MyISAM支持地理空间索引,可使用任意维度组合查询,使用特有的函数访问,常用于做地理数据存储,使用不多
前缀索引:通过对列值的前缀进行索引,可以用更少的存储空间来减少索引建立的开销。但是它也可能会导致查询效率降低,因为前缀长度可能太短而无法定位到正确的行。
聚簇和非聚簇索引,主键、二级索引:
冗余和重复索引:
冗余索引:指的是一个表上存在多个索引,但是只有其中一个索引是有用的。比如,在一个包含多个列的复合索引中,某些列已经在其他的单独索引中进行了覆盖。这会占用大量的存储空间并导致索引的更新和查询成本增加,如(A),(A,B)
重复索引:已经有索引,再次建立索引
索引结构
二叉树
红黑树
B-tree索引结构
B+Tree索引
注 B+Tree索引:按顺序存储,每一个叶子节点到根结点的距离是相同的;左前缀索引,适合查询范围类的数据
B+TREE索引语句使用类型
使用 B+Tree 索引可以加速以下类型的查询:
等值查询:例如,WHERE column_name = value ,这种查询可以在 B+Tree 索引中使用二分查找策略加快查找速度。
区间查询:例如,WHERE column_name BETWEEN value1 AND value2,B+Tree 索引以叶子节点的形式存储数据,将数据从小到大排列,因此可以直接查找一个区间范围内的所有数据,而不需要扫描整个表。
以某列开头的查询:例如,WHERE column_name LIKE 'value%',以及其他使用匹配表达式开头的查询,B+Tree 索引也可以加速,因为它可以按照键的前缀匹配查找对应的数据。
排序查询:B+Tree 索引按照键的大小对数据进行排序存储,因此对于需要排序的查询,可以直接使用 B+Tree 索引查找数据,而不需要先将整个表扫描一遍进行排序。
需要注意的是,B+Tree 索引不适用于以下情况:
不等值查询:例如,WHERE column_name > value 或 WHERE column_name != value,这些查询可能需要扫描整个表才能找到对应的数据。
使用函数的查询:例如,WHERE func(column_name) = value,由于函数的返回值无法预测,B+Tree 索引无法直接使用。
多表关联查询:如果查询涉及多个表之间的关联操作,那么 B+Tree 索引的效率就无法发挥,需要使用其他类型的索引来优化。