实习准备

数据库

2019-03-07  本文已影响0人  陈子晞CZX

一、数据库三范式

1NF:数据表的每一列都是原子的,即列不能再细分为更小的列。

2NF:在1NF的基础上,要求表有主码,且非主码列必须完全依赖于主码列。

3NF:在2NF的基础上,要求非主码列必须直接依赖于主码列。

补充:BCNF,在3NF的基础上,要求主码列不能部分或间接依赖于主码。

二、数据库索引

概念

数据库索引是一种对数据表中一列或者多列排序的结构,使用索引可以快速查找特定信息。

分类

普通索引:基本索引,没有限制。

唯一索引:要求索引列的取值是唯一的,但可以为Null。

主键索引:建立在主码上的索引(数据表默认都会为主码建索引)。

组合索引:多列构成的索引,遵循最左前缀原则。

全文索引:fulltext,只能在char,varchar,text上建立全文索引,用于查找文本中的关键字

优缺点

优点:加快查询速度;加快表连接速度;加快查询中分组和排序的速度。

缺点:占用物理空间;增删改时需要同时维护索引,降低了这些操作的速度。

使索引失效的操作

1、列的取值存在Null,例如a为索引,使用语句a is null会使索引失效,但是a = "12"是不会的(单列索引不匹配null值,复合索引不匹配全为null的值)。2、where中使用not in 或者 <> 。3、在列上进行计算。4、“%ab”这样的like语句,而“ab%”是可以使用索引的。5、尽量不要使用select *,因为会导致覆盖索引不可用。

B+树

是MySQL数据库的索引的底层实现,具体的B+树的实现就不介绍了。好处是命中稳定;更新和查询都很快;数据都存在叶节点,且以链表的形式有序排列。

三、数据库索引引擎

四、数据的四大特性

ACID

原子性(Atomicity):事务的所有操作要么都执行成功,要么都不成功。

一致性(Consistency):事务必须使数据库从一个一致性状态变成另一个一致性状态。

隔离性(Isolation):当存在并发用户同时访问数据库时,并发事务之间相互隔离,互不影响。

持久性(Durability):事务操作一旦提交,它对数据库的修改就是永久性的。

五、数据库的隔离级别及其实现

要谈论数据库的隔离级别,首先得说说在读取数据库数据时,可能出现的问题。

问题一:脏读

事务B正在修改数据d,此时事务A读取数据d,最后B回滚了,那么A得到的数据就是脏数据。

问题二:不可重复读

事务A在循环读取数据d,此时,事务B修改数据d并提交了,下一次A读取数据时,发现前后读取的不一样,所以重复读取的数据不一致,出现不可重复读问题。

问题三:幻读

事务A正在将表t中的数据字段年龄全部改成15,此时事务B向表中插入一条数据,且年龄为10,操作成功提交。当事务A检查表t的数据时,发现存在未被修改的数据行。此时发生幻读。

针对以上问题,数据库有四种对应的隔离级别

级别一:读取未提交(Read Uncommitted)

会发生脏读、不可重复的、幻读

锁实现:事务在读数据的时候并未对数据加锁。事务在修改数据的时候只对数据增加行级共享锁。

级别二:读取已提交(Read Committed)

会发生不可重复读、幻读

锁实现:事务在读数据的时候对数据加行级共享锁,读取结束立即释放锁。事务在修改数据时对数据加行级排他锁,直到整个事务结束。

级别三:可重复读(Repeatable Read)

会发生幻读

锁实现:事务在读数据的时候对数据加行级共享锁,直到整个事务结束。事务在修改数据时对数据加行级排他锁,直到整个事务结束。

级别四:可串行化(Serializable)

锁实现:事务在读数据的时候对数据加表级共享锁,直到整个事务结束。事务在修改数据时对数据加表级排他锁,直到整个事务结束。

数据库锁说明

行级锁:对某行数据加锁。

表级锁:对整个表加锁。

共享锁(读锁):允许其他事务读(加读锁),但是不许其他事务写(加写锁)

排他锁(写锁):不许其他事务读或写。

六、数据库连接池

为了避免每次访问数据库都要重新建立连接,可以为数据库建立连接池。

连接池有个最小连接数,当需要连接时,直接返回池中的连接对象。当请求超过最小连接数时,会建立新的连接,直到达到最大连接数。此时,后来的数据库连接请求就会到队列中等待。

超过最小连接数的连接在使用完之后不会立即释放,而是等待被重复使用,或者超过指定时间被释放。

自定义实现数据库连接池,需要实现DataSource接口,其中需要考虑的关键问题是不能直接将连接对象返回给用户,因为这样他就可以通过连接对象的close()方法直接关闭连接了,所以得使用装饰模式封装连接对象,重写close()方法。

七、MySQL数据库优化

(1)根据服务层面:配置mysql性能优化参数;

(2)从系统层面增强mysql的性能:优化数据表结构、字段类型、字段索引、分表,分库、读写分离等等。

(3)从数据库层面增强性能:优化SQL语句,合理使用字段索引。

(4)从代码层面增强性能:使用缓存和NoSQL数据库方式存储,如MongoDB/Memcached/Redis来缓解高并发下数据库查询的压力。

(5)减少数据库操作次数,尽量使用数据库访问驱动的批处理方法。

(6)不常使用的数据迁移备份,避免每次都在海量数据中去检索。

(7)提升数据库服务器硬件配置,或者搭建数据库集群。

(8)编程手段防止SQL注入:使用JDBC PreparedStatement按位插入或查询;正则表达式过滤(非法字符串过滤);

八、表的连接

连接类型

inner join        left outer join        right outer join        full outer join

区别:内连接不会保留不具有相同列的行。而外连接会(left只保留出现在左表不出现在右表的行,right只保留出现在右表不出现在左表的行,full都保留)。

连接条件

natural        on        using

区别:natural对于相同取值的列只保留一次;on对相同取值的列会保留两次,同时on还可以跟其他谓词,功能相当于where语句;using可以指定匹配的列。

使用方式

通过将连接类型和连接条件进行组合,可以得到不同的表连接方式。

例如:natural inner join,left outer join...on...,join...using...

上一篇 下一篇

猜你喜欢

热点阅读