2、MySQL索引

索引数据结构

二叉树

  • 特点:左小右大。二分查找法(折半查找法)
  • 缺点:极端情况下会转化成链表,查询效率低下
    在这里插入图片描述

平衡二叉树

  • 特点:主要解决二叉树变成来链表的问题,具有二叉查找树的全部特性,左叶子树永远比右叶子树高至少1节,
  • 缺点:极端情况下可能右叶子树只有一个节点,左叶子树有n多个节点,
    在这里插入图片描述

红黑树

特点

  1. 每个节点非红即黑。
  2. 根节点是黑色。
  3. 每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
  4. 如果一个节点是红色的,则它的子节点必须是黑色的。
  5. 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。(主要目的降低树的高度)
    在这里插入图片描述

B Tree

特点

  1. 在红黑树的基础上,每个节点存储多条数据,已降低数据的高度,
  2. 结点中的所有数据不重复,节点中的所有数据从左到右依次递增
  3. 每一个索引数据会关联一个data(数据库的中的整条数据)
  4. 范围查找时需要从根节点重新定位索引。
    在这里插入图片描述

B+Tree

特点

  1. 父子级节点数据之间数据会冗余
  2. 非叶子节点不存储data数据,非叶子节点可以存储更多数据
  3. 叶子节点用指针连接,提高区间访问性能
  4. Mysql中的B+树在原有B+树的基础又做啦优化,将叶子节的单链表优化为双链表。
    在这里插入图片描述

关于tree数据结构有一个不错的学习网站推荐给大家

Hash

  对索引的key进行一次hash计算就可以定位出数据存储的位置,hash冲突的解决方式和hashmap一样,也是通过数组加链表
  定值查询比任何树形数据结构都要快,唯一但也是致命的缺陷就是不支持范围查找

索引类型

聚簇索引和非聚簇索引

  • 聚簇索引:将数据存储与索引放到了一块、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的
  • 非聚簇索引:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类似一本书的目录,比如我们要找第三章第一节,那我们先在这个目录里面找,找到对应的页码后再去对应的页码看文章

联合索引

  1. 按照索引的创建顺序,多个字段合并在一个节点中,只支持按照字段顺序查找,跳字段查询,索引失效。
  2. 最左前缀原则在这里插入图片描述

密集索引和稀疏索引

  • 密集索引
    叶子节点保存的不只是键值,还保存了位于同一行记录里的其他列的 信息,由于密集索引决定了表的物理排列顺序,一个表只有一个物理排列顺序,所以一个表只能创建一个密集索引。

  • 稀疏索引
    叶子节点仅保存了键位信息以及该行数据的地址,有的稀疏索引只保存了键位信息机器主键。
    mysam存储引擎,不管是主键索引,唯一键索引还是普通索引都是稀疏索引,innodb存储引擎:有且只有一个密集索引。所以,密集索引就是innodb存储引擎里的聚簇索引,稀疏索引就是innodb存储引擎里的普通二级索引。

覆盖索引/索引覆盖

  InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),
  从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,大小要远小于聚集索引,因此可以减少大量的IO操作。所以覆盖索引可以视为索引优化的一种方式,而并不是索引类型的一种

三星索引

  • 索引将相关的记录都放到一起(放在一个磁盘页中)则获得一星;
  • 如果索引中的数据顺序和查找中的排列顺序一致则获得二星;
  • 如果索引中的列包含了查询中需要的全部列则获得三星。

索引类型总结

  从数据结构角度可分为B+树索引、哈希索引、以及FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)和R-Tree索引(用于对GIS数据类型创建SPATIAL索引);

  从物理存储角度可分为聚集索引、非聚集索引;

  从逻辑角度可分为主键索引、普通索引,或者单列索引、多列索引、唯一索引、非唯一 索引等等

存储引擎

Myisam引擎

  1. 主键索引类型属于非聚集索引,索引和数据文件时分开存储的,不支持事务,不支持行锁,只有表锁。比较使用的业务:
  2. MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。

innoDB引擎

  1. 主键索引类型属于聚集索引,索引和数据放在一起,定位到索引时可以直接获取下面的data。
  2. 支持事务
  3. InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁,因为有mvcc机制。但是update、insert、delete操作会自动给涉及的行加写锁。

为什么建议InnoDB表必须建主键并且推荐使用整型的自增主键
  innoDB表没有主键的话会挨个遍历表中所有的列,找出一列没有重复数据的列作为主键创建主键索引,如果没有符合要求的列,mysql会自己维护一个隐藏的自增列来创建主键索引。
  推荐使用整形的自增主键是因为和uuid相比,整形占空间小,每个节点可以存储更多索引,自增的主要原因是因为自增是有序的,B+树不需要每次都左旋右旋来维护平衡,uuid无需,每次都需要通过左旋和右旋来维护树的平衡。

为什么非主键索引结构叶子节点存储的是主键值

  1. 节省存储空间;
  2. 保证一致性方便维护,数据中非索引列需要修改时,只修改主键索引中的data就可以。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值