一、数据库三范式
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...
网友评论