数据库-基础版

如何设计一个数据库?

程序实例:

存储管理(需要对数据的格式以及文件的分割进行统一管理)

SQL解析(对SQL进行编译解析,供机器可读)

日志管理(对操作做记录)

权限划分

容灾机制(处理异常情况)

索引管理

锁管理

存储模块:文件系统

为什么要使用索引?

防止全表扫描,降低IO随机读操作,提高查找效率

什么样的信息可以成为索引?

主键,唯一键,经常出现在where语句中的字段,数据重复率低的字段

索引的数据结构?

建立B-Tree结构进行查找(节点中:指针,关键字,数据)

建立B+Tree结构进行查找

非叶子节点仅用来索引,关键字都保存在叶子节点中,所有叶子节点均有一个链指针指向下一个叶子节点

MyISAM中B+Tree的存储方式:主键/非主键索引的叶子节点都是存储指向数据块的指针【这种方式称为非聚簇索引】,InnoDB中B+Tree的存储方式称为聚簇索引

B+Tree更适合用来做存储索引

1. B+Tree树的磁盘读写代价更低(B+树的非叶子节点只存放索引,不存放数据,因此其内部节点相对B-Tree更小,如果把所有同一内部节点的关键字存放在同一盘块中,B+Tree存储的节点更多,一次性读取到内存中的索引信息更多,降低IO读取次数)

2. B+Tree的查询效率更稳定(因为非叶子节点只存放索引,不存放数据,所以每一次查询都是从根节点读取到叶子结点,距离相同,效率相同)

3. B+树更有利于对数据库的扫描(B+Tree只需要遍历叶子结点,就可以完成对全部关键字的扫描,适用于范围查询,并且拥有更高的效率)

B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据

非聚簇索引一定会回表查询吗?

不一定,这涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询

举个简单的例子,假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询

联合索引

MySQL

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java之项目解析+八股文 文章被收录于专栏

针对Java简历中项目的功能进行提问,大家可以在评论区中解答/讨论;同时提供八股文

全部评论

相关推荐

点赞 6 评论
分享
牛客网
牛客企业服务