关系型数据库:
- 架构
- 索引
- 锁
- 语法
- 理论范式
如何设计一个关系型数据库?
索引模块
常见问题
- 为什么要使用索引
快速查询数据,避免全表扫描
- 什么样的信息能成为索引
主键、唯一键以及普通键
- 索引的数据结构
➢生成索引,建立二叉查找树进行二分查找 log(n)
➢生成索引,建立B-Tree结构进行查找
➢生成索引,建立B+-Tree结构进行查找
➢生成索引,建立Hash结构进行查找
- 密集索引和稀疏索引的区别
B-Tree
定义
- 根节点至少包括两个孩子
- 树中每个节点最多含有m个孩子( m>=2 )
- 除根节点和叶节点外,其他每个节点至少有ceil(m/2)个孩子
- 所有叶子节点都位于同一层
B+树
是B树的变体,其定义基本与B树相同,除了:
- 非叶子节点的子树指针与关键字个数相同
- 非叶子节点的子树指针P[i] ,指向关键字值[K[i], K[i+ 1])的子树
- 非叶子节点仅用来索引,数据都保存在叶子节点中
- 所有叶子节点均有一个链指针指向下一个叶子结点
结论
B+ Tree更适合用来做存储索引
- B+树的磁盘读写代价更低
- B+树的查询效率更加稳定
- B+树更有利于对数据库的扫描
Hash索引|也可以考虑一下
缺点
- 仅仅能满足“=”, “IN”
- 不能使用范围查询
- 无法被用来避免数据的排序操作
- 不能利用部分索引键查询
- 不能避免表扫描
- 遇到大量Hash值相等的情况后性能并不一定就会比B-Trea索引高
BitMap索引
不适合高并发的联机事务处理系统,适合并发较少且统计运算较多的系统
密集索弓|和稀疏索弓|的区别
- 密集索引文件中的每个搜索码值都对应一个索引值
- 稀疏索引文件只为索引|码的某些值建立索引项
额外的知识
InnoDB
- 若一个主键被定义,该主键则作为密集索引
- 若没有主键被定义,该表的第一个唯一 非空索引|则作为密集索引
- 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引)
- 非主键索弓引|存储相关键位和其对应的主键值,包含两次查找
衍生出来的问题,以mysq|为例
1、如何定位并优化慢查询Sq|
具体场景具体分析,只提出大致思路
- 根据慢日志定位慢查询sq|
# 查询全局变量 show variables like '%quer%';
修改全局变量
set global slow_query_log = on;
set global long_query_time = 1;
![](https://i0.wp.com/tva1.sinaimg.cn/large/00831rSTly1gdft0wdnx3j31ef0u0n2n.jpg)
#本次会话mysql的条数
show status like ‘%slow_queries%’;
![](https://i0.wp.com/tva1.sinaimg.cn/large/00831rSTly1gdft163ewlj31mk0e8tap.jpg)
* 使用explain等工具分析sq|
* 修改sq|或者尽量让sq|走索引提升性能
#### 2、联合索引的最左匹配原则的成因
#### 3、索引是建立得越多越好吗
### 存储引擎
##### 1、查看MySQL提供的所有存储引擎
```mysql
mysql> show engines;
从图中可以看出InnoDB
是MySQL
当前默认的存储引擎(5.5版本后)。只有InnoDB
是事务性存储引擎,支持事务,同时,它有行级锁和外键。
2、查看表的存储引擎
mysql> show table status like "zyctd";
解释一下什么是池化设计思想。什么是数据库连接池?为什么需要数据库连接池?
池化设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。除了初始化资源,池化设计还包括池子的初始值、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。
数据库连接本质就是一个 socket 的连接。数据库服务端还要维护一些缓存和用户权限信息之类的 所以占用了一些内存。我们可以把数据库连接池是看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。*在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。 *连接池还减少了用户必须等待建立与数据库的连接的时间。