目录
六、数据库
1、什么是MySQL?
MySQL是一种关系型数据库,在Java企业级开发中非常常用,因为MySQL是开源免费的,并且方便扩展。阿里巴巴数据库系统也大量用到了MySQL。因此他的稳定性是有保障的,MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改
2、数据库三范式
1.原子性约束(每列不可再分)
2.对记录的唯一性约束,表中的每个记录都是唯一的(设置主键)
3.对字段冗余性的约束,他要求字段没有冗余,但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据,具体的做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到屋里数据模型设计时考虑,允许冗余
3、MyISAM和InnoDB的区别
innoDB支持事务,MyISAM不支持
MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
InnoDB支持外键,MyISAM不支持
从MySQL 5.5之后,InnoDB是默认引擎
InnoDB不支持FULLTEXT类型的索引
InnoDB中不保存表的行数,如select count() from table 时,InnoDB需要扫描以便整个表来计算有多少行,但是MyISAM只要简单的独处保存好的行数就可以了
对于自增长的字段,InnoDB必须包含只有该字段的索引,但是MyISAM表中可以和其他字段一起建立联合索引
清空整个表时,InnoDB是一行一行的删除,效率非常慢,MyISAM则会重建表
InnoDB支持行级锁
4、简单介绍MySQL索引使用的数据结构
MySQL索引使用的数据结构主要有BTree索引和哈希索引,对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快,其余大部分场景,建议选择BTree索引
MySQL的BTree索引使用的是B树中的B+Tree
5、什么是事务
事务是逻辑上的一组操作,要么都执行,要么都不执行
事务最经典的例子:银行转账
6、事务的四大特性
原子性:事务是最小的执行单位,不允许分割,事务的原子性确保动作要么全部完成,要么全部不起作用
一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的
隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
持久性:一个事务被提交之后, 他对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响
7、并发事务带来哪些问题
脏读:当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据, 因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据脏数据所做的操作可能是不正确的
丢失修改:指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据,这样第一个事务内的修改结果就被丢失,因此称为丢失修改
不可重复读:指在一个事务内多次读同一数据,在这个事务还没有结束时,另一个事务也访问该数据。那么在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读
幻读:幻读与不可重复读类似,他发生在一个事务读取了几行数据,接着另一个并发事务插入了一些数据时,在随后的查询中,第一个事务就会发现多了一些原本不存在的记录,就好像发生了幻觉一样
不可重复读和幻读的区别:不可重复的的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了
8、事务隔离级别有哪些?MySQL的默认隔离级别是?
READ-UNCOMMITTED(读取未提交)最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读,幻读,不可重复读
READ-COMMITTED(读取已提交)允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
REPEATABLE-READ(可重复读)对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
SERIALIZABLE(可串行化)最高的隔离级别,完全服从ACID的隔离级别,所有的事务以此逐个执行,这样事务之间就完全不可能产生干扰,可阻止脏读,不可重复读,幻读
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) InnoDB存储引擎在分布式事务的情况下一般会用到SERIALIZABLE(可串行化)隔离级别
9、什么是数据库连接池,为什么需要数据库连接池
数据库连接本质就是一个socket的连接,数据库服务端还要维护一些缓存和用户权限信息之类的,所以占用了一些内存,我们可以把数据库连接池看做是维护的数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其是对动态数据库驱动的网站应用程序的请求,即昂贵又浪费资源
在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接,如果使用了所有连接,则会建立一个新连接并将其添加到池中,连接池还减少了用户必须等待建立与数据库的连接的时间