MySql 索引详解(2)

MySql 索引详解(2)

索引类型总结

按照数据结构维度划分:

  • BTree 索引:MySql 里默认和最常用的索引类型。只有叶子节点存储 Value,非叶子节点只有指针和 Key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 B+Tree ,单二者的实现方式不一样。
  • 哈希索引:类似键值对的形式,一次即可定位
  • RTree 索引:一般不会使用,仅支持 geometry 数据类型,优势在于范围查找,效率比较低,通常使用搜索引擎如 Es 代替
  • 全文索引:对文本内容进行分词,进行搜索。效率较低,通常使用 ES 代替

按照底层存储方式角度划分:

  • 聚簇索引(聚集索引):索引结构和数据一起存放的索引,InnoDB 中的主键索引就属于聚簇索引。
  • 非聚簇索引(非聚集索引):索引结构和数据分开存放的索引,二级索引(辅助索引)就属于非聚簇索引。MySQL 的 MyISAM 引擎,不管主键还是非主键,使用的都是非聚簇索引。

按照应用维度划分:

  • 主键索引:加速查询 + 列值唯一(不可以有 NULL)+ 表中只有一个。
  • 普通索引:仅加速查询。
  • 唯一索引:加速查询 + 列值唯一(可以有 NULL)。
  • 覆盖索引:一个索引包含(或者说覆盖)所有需要查询的字段的值。
  • 联合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并。
  • 全文索引:对文本的内容进行分词,进行搜索。目前只有 CHARVARCHARTEXT 列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如 ElasticSearch 代替。

主键索引

​ 数据表的主键使用的就是主键索引。

​ 一张数据表只能有一个主键,并且主键的值不能为null,不能重复。

​ 在 MySql 的 InnoDB 表中,当没有显示的指定表的主键时, InnoDB 会自动先检查表中是否有唯一索引且不允许 null 值的字段,如果有,则选择该字段为默认主键,否则 InnoDB 将会自动创建一个 6Byte 的自增主键。

二级索引

二级索引又称为辅助索引,是因为二级索引的叶子存储的数据是主键。也就是说,通过二级索引,可以定位主键的位置。

​ 唯一索引,普通索引,前缀索引等索引都属于二级索引。

  1. 唯一索引:唯一索引也是一种约束。唯一索引的属性列不能出现重复的数据,但是允许数据为 null,一张表允许创建多个唯一索引。建立唯一索引的目的大部分时候都是为了该属性列的数据的唯一性,而不是为了查询效率
  2. 普通索引:普通索引的唯一作用就是为了快速查询数据,一张表允许创建多个普通索引,并允许数据重复和为Null
  3. 前缀索引:前缀索引只适用于字符串类型的数据。前缀索引是对文本的前几个字符创建索引,想必普通索引简历的数据更小,因为只提取前几个字符。
  4. 全文索引:全文索引主要是为了检索大文本数据中的关键词信息,是目前搜索引擎数据库使用的一种技术。

聚簇索引与非聚簇索引

聚簇索引

​ 聚簇索引即索引结构和数据一起存放的索引,并不是一种单独的索引类型。InnoDB 中的主键索引就属于聚簇索引

聚簇索引的优缺点

优点:

  • 查询速度非常快: 聚簇索引的查询速度非常块,因为整个 B+ 树本身就是一颗多叉平衡树,叶子节点也是有序的,定位到索引的节点,就相当于定位到了数据。相比于非聚簇索引,聚簇少了一次读取数据的 IO 操作。
  • 对排序查找和范围查找优化: 聚簇索引对于主键的排序查找和范围查找的速度非常快

缺点:

  • 依赖于有序的数据: 因为 B+ 树是多路平衡树,如果索引的数据不是有序的,那么就需要在插入时排序,如果数据是整形还好,否则类似于字符串或者 UUID 这种长难数据,插入和查找的速度会比较慢
  • 更新代价大: 如果对索引列的数据被修改时,那么对应的索引也将被修改,而且聚簇索引的叶子节点还存放着数据,修改代价肯定是较大的,所以对于主键索引来说,主键一般都是不可被修改的。
非聚簇索引

​ 非聚簇索引即索引结构和数据分开存放的索引,并不是一种单独的索引类型。二级索引就属于非聚簇索引。MySql 的 MyISAM 引擎,不管是主键还是非主键,使用的都是非聚簇索引。

​ 非聚簇索引的叶子节点并不一定存放数据,因为二级索引的叶子节点就存放的是主键,根据主键再回表查数据。

非聚簇索引的优缺点

优点:

  • 更新代价比聚簇索引要小

缺点:

  • 依赖有序的数据
  • 可能会二次查询回表):这应该是非聚簇索引最大的缺点了,当查询到索引对应的指针或者主键后,可能还需要根据指针或者主键再到数据文件中查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值