数据库-基础版
如何设计一个数据库? |
程序实例: 存储管理(需要对数据的格式以及文件的分割进行统一管理) 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全新整理八股文 + 场景题 + 算法 精心设计,面试命中率超过80% 专栏优势: 1、问题和答案已经整理到位,答案更专业,可以直接回答,不需要额外总结! 2、场景题讲解清晰,适用于大部分场景的项目,并且持续更新中 3、分享学习心得【知识点的广度和深度,算法有哪些坑,如何准备面试等等】