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+树结构 | 能存储多少数据 等等的主要内容,如果未能解决你的问题,请参考以下文章