索引的基础

1.索引的定义:

索引是存储引擎用于快速找到记录的一种数据结构。

索引可以包含一个或多个列的值。如果索引包含多个列,那么列 的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列

2.索引的类型

B-Tree索引

【实际上很多的存储引擎使用的是B+Tree,B+树是自平衡的多叉搜索树,即每一个叶子节点都包含只想下一个叶子结点的指针,从而方便叶子结点的范围遍历】innoDB默认的使用B+树

B-Tree索引能够加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,取而代之的是从索引的根节点开始进行搜索。根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。索引对多个值进行排序的依据是Create Table语句中定义索引列的顺序

索引的匹配:

(1)全值匹配:指的是和索引中所有的列进行匹配;

(2)最左前缀匹配:例如找出在学生表中找出姓唐的学生;

(3)匹配列前缀:也可以值匹配某一列的值的开头部分;

在MySQL中只有Memory存储引擎支持哈希索引

哈希索引的特点:

(1)哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行。不过,访问内存中的行的速度很举哀,所以大部分情况下这一点对性能的影响不明显;

(2)哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序;

(3)哈希索引也不会支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如,在数据列(A,B)上建立哈希索引,如果查询只有数据列A,则无法使用该索引。

(4)哈希索引只支持等值比较查询,包括=、IN()、<=>,也不支持任何范围查询;

(5)访问哈希索引的数据非常快,除非有很多哈希冲突(不同的索引列值却有相同的哈希值)。当出现哈希冲突的时候,存储引擎必须遍历链表所有的行指针,逐行进行比较,知道找到所有符合条件的行;

(6)如果哈希冲突很多的话,一些索引维护操作的代价也会很高。例如,如果在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么当从表中删除一行时,存储引擎需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用,冲突越多,代价越大

InnoDB中的自适应哈希索引

当InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引,这样就让B- Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。这是一个完全自动的、内部的行为,用户无法控制或者配置,不过如果有必要,也完全可以关闭该功能。

空间数据索引

MyISAM表支持空间数据索引,可以用作地理数据存储。B-Tree索引不同,这类索引无须前缀查询。空间索引会从所有维度来索引数据。查询时,可以有效地使用任意维度来组合查询。必须使用MySQL的GIS相关函数来维护数据。

全文索引

全文索引是一种特殊类型的索引,它查找的文本中的关键词,而不是直接比较索引中的值。全文搜索和其他几类索引的匹配方式完全一样。它有许多需要注意的细节,如停用词、词干和复数、布尔搜索等

索引的优点:

(1)索引大大减少了服务器需要扫描的数据量;

(2)索引可以帮助服务器避免排序和临时表;

(3)索引可以将随机I/O变为顺序I/O

聚簇索引:

InnoDB 的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的数据行实际上存放在索引的叶子中。术语“聚簇”表示数据行和相邻的值紧凑的存储在一起。因为无法同事把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值