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

        • 0. 什么是索引,有什么优缺点?
        • 1. MySQL索引为什么使用B+树的数据结构?
        •  1.1. 为什么不使用hash结构
        •  1.2. 为什么不使用红黑树等二叉树结构
        •  1.3. 为什么不使用B树结构
        •  1.4. 索引为什么使用B+树结构
        • 2. MySQL能存储多少数据?
        • 3. 什么是回表 | 索引覆盖 | 索引下推 | 最左前缀原则?
        • 4. 非聚簇索引一定会回表么?
        • 5. 联合索引使用时要注意什么?
        • 6. MyISAM和InnoDB有什么区别?
        • 7. 为什么建议InnoDB表建主键,并且推荐使用整型自增id作主键?
        • 8. 主键索引和唯一索引有什么区别?

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,导致查询效率慢

MySQL(3) -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等_第1张图片

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

MySQL(3) -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等_第2张图片

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

MySQL(3) -- 索引相关的一些问题 | 为什么使用B+树结构 | 能存储多少数据 等等_第3张图片

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. 主键索引和唯一索引有什么区别?
  • 主键索引不能重复且不能为空,唯一索引不能重复但可以为空
  • 一张表只能有一个主键索引,但可以有多个唯一索引
  • 主键索引的查询性能要高于唯一索引

你可能感兴趣的:(SQL,mysql,索引结构,B+树,面试题,数据结构)