MySQL -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等

Posted 做猪呢,最重要的是开森啦

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等相关的知识,希望对你有一定的参考价值。

0. 什么是索引,有什么优缺点?

  • 索引就是排好序的数据结构
  • 优点就是查询快,缺点就是占内存

1. mysql索引为什么使用B+树的数据结构?

 有那么多数据结构,如hash、二叉树、平衡二叉树、红黑树、B树等等,我们先来说说为什么不用这些结构

 1.1. 为什么不使用hash结构

  • hash结构需要优秀hash算法来解决哈希碰撞问题,
  • hash结构数据是散列不均匀的,这也导致不能支持范围查询
  • hash结构需要大量的内存空间(超大的数组),造成内存浪费

 1.2. 为什么不使用红黑树等二叉树结构

  • 像BST(平衡搜索树)、AVL(平衡车查找树)、红黑树等都是二叉树,每一个节点下面最多只有两个节点
  • 要想插入更多的数据,树就会变得越来越高(深),对于存储引擎磁盘交互来说,变深就会导致IO次数变多,导致查询效率低

 1.3. 为什么不使用B树结构

  • B树的每个非叶节点可以有多个子树,能解决树高的问题,但还是不是很理想,因为B树非叶子节点也保存数据
  • B树非叶子节点保存数据,导致相同树高保存的数据比B+树少
  • B树非叶子节点保存数据,在查询连续数据时可能导致会带来更多的随机 I/O
  • 好比我要查找>5的数据,要再三层节点去遍历获取数据,这都会造成IO,导致查询效率慢

在这里插入图片描述

 1.4. 索引为什么使用B+树结构

  • B+树在B树上进行优化,非叶子节点存储磁盘地址,叶子节点保存数据,叶子节点间是链表连接的
  • 非叶子节点不存储数据,能就能存储更多的磁盘地址,就能存储更多数据
  • 叶子节点间是链表连接的,查询连续数据时可以从叶子节点直接读取,减少IO次数

在这里插入图片描述

2. MySQL能存储多少数据?

  • InnoDB存储引擎中每个节点使用一个页(page),页的大小为16KB,对于InnoDB的B+索引来说,树的高度一般在2-4层
  • 假设三层树高索引,Key为bigInt类型占8字节,下一节点磁盘地址占6字节
  • 那么第一层和第二层非叶子节点分别可以有16*1024/14=1170磁盘地址
  • 叶子节点除了Key占8个字节,还保存数据,一般一行普通数据假设1KB,那么每个叶子节点大概能保存16行数据
  • 所以三层树高可以有1170117016=2190千万,大约有可以保存两千万的数据

在这里插入图片描述

3. 什么是回表 | 索引覆盖 | 索引下推 | 最左前缀原则?

 可以参考这篇文章

4. 非聚簇索引一定会回表么?

 相信看了上面的文章,一定会答不一定;如果查询的字段能再索引中命中,就不会再回表,也就是索引覆盖

5. 联合索引使用时要注意什么?

 相信看了上面的文章,一定会答注意最左前缀原则,避免索引失效,此外一般将识别度高的放在最左边

6. MyISAM和InnoDB有什么区别?

  • MyISAM 只有表级锁(table-level locking);而 InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。
  • MyISAM 不提供事务支持;而InnoDB 提供事务支持,具有提交(commit)和回滚(rollback)事务的能力。
  • MyISAM 不支持外键;而 InnoDB 支持。
  • MyISAM 不支持数据库异常崩溃后的安全恢复;而 InnoDB 支持,数据库重新启动的时候会保证数据库恢复到崩溃前的状态
  • MyISAM 不支持MVCC;而 InnoDB 支持。
  • 更多内容可以查看存储引擎和索引数据结构介绍

7. 为什么建议InnoDB表建主键,并且推荐使用整型自增id作主键?

  • 主键是关联表数据的,如果不主动建主键,MySQL就会自个去维护一个主键,这肯定对性能有影响
  • 自增主键是连续的,再查找数据时,通过整型的比较就能定位数据,比其他(比如uuid,字符串比较)要快

8. 主键索引和唯一索引有什么区别?

  • 主键索引不能重复且不能为空,唯一索引不能重复但可以为空
  • 一张表只能有一个主键索引,但可以有多个唯一索引
  • 主键索引的查询性能要高于唯一索引

以上是关于MySQL -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等的主要内容,如果未能解决你的问题,请参考以下文章

mysql 一些小问题

MySQL面试高频100问

MySQL面试高频100问

MySQL面试高频100问

如何操纵 MySQL 全文搜索相关性以使一个字段比另一个字段更“有价值”?

读高性能Mysql摘要