面经-- 数据库篇
1.视图
定义: 视图是从一个或几个基本表(或视图)导出的表,是一个虚表。
数据库中只存放视图的定义,而不存放视图的数据。
create view xxx as select xx,xx from tb_ where
create view语句只把视图的定义存入字典,并不执行select语句。
2.查询优化
- 代数优化
查询优化的优点不仅在于,用户不必考虑如何最好地表达查询以获取较高的效率,而且在于系统可以比用户程序优化的更好。因为:
- 系统从数据字典中获取的信息更多。
- 系统可以考虑上百种不同的执行计划。
- 系统中有很多优秀的程序员设计的优化算法。
总代价=I/O代价+CPU代价+内存代价+通信代价
- 选择运算尽量先做
- 物理优化
对于小关系,使用全表顺序扫描,即使有索引。
对于大关系,启发式规则:
- 主码=值 查询结果是一元组,使用索引。
- 非主属性=值,并且列上有索引,要估算查询结果的元组数目。
- 非等值查询并且列上有索引,要估算查询结果的元组数目。
- and 联合索引优先
1.为什么要使用连接池
1、不使用连接池流程
下面以访问MySQL为例,执行一个SQL命令,如果不使用连接池,需要经过哪些流程。
不使用数据库连接池的步骤:
- TCP建立连接的三次握手
- MySQL认证的三次握手
- 真正的SQL执行
- MySQL的关闭
- TCP的四次握手关闭
可以看到,为了执行一条SQL,却多了非常多网络交互。
优点:
- 实现简单
缺点:
- 网络IO较多
- 数据库的负载较高
- 响应时间较长及QPS较低
- 应用频繁的创建连接和关闭连接,导致临时对象较多,GC频繁
- 在关闭连接后,会出现大量TIME_WAIT 的TCP状态(在2个MSL之后关闭)
2、使用连接池流程
第一次访问的时候,需要建立连接。 但是之后的访问,均会复用之前创建的连接,直接执行SQL语句。
优点:
- 较少了网络开销
- 系统的性能会有一个实质的提升
- 没了麻烦的TIME_WAIT状态
3、总结
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
4、不同数据库连接池的特点
名称 | 说明 |
C3P0 | 速度相对慢,稳定性高 |
DBCP | 速度相对 CP30 快,不稳定 |
Proxool | 稳定性相对 C3P0 差,有监控连接池状态的功能 |
BoneCP | 速度快 |
Druid | 集 CP30、DBCP、Proxool 优点 |