数据库范式
1NF(第一范式)
属性不能被分割,所有关系型数据库的基本要求。
2NF(第二范式)
消除了非主属性对于码的部分函数依赖。
3NF(第三范式)
消除了非主属性对于码的传递函数依赖。
存储过程
带逻辑控制的一些SQL语句的集合,比单纯SQL语句执行快。
缺点:应用不多,难以调试和扩展,可移植性差,消耗数据库资源。
数据库设计一般步骤
需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库实施、运行和维护
mysql存储引擎
存储引擎MyISAM和InnoDB的区别:
InnoDB支持主外键;事务;行锁-操作时只锁定一行,不对其他行有影响,适合高并发操作;缓存索引和数据,对内存要求较高,内存大小会影响性能;
MyISAM不支持主外键,事务;表锁,即使操作一条数据也会锁整个表,不适合高并发操作;只缓存索引。
查询缓存
开启查询缓存后,会在同样的查询条件和数据的情况下,会直接在缓存中返回结果。缓存虽然提高查询效率,但会带来额外开销,每次查询后都会做一次缓存操作,失效后还要销毁。
什么是事务
事务:逻辑上的一组操作,要么都执行,要么都不执行。
事务的四大特性ACID
原子性:一组操作不可分割,要么都执行,要么都不执行
一致性:执行事务前后,数据保持一致,多个事务对同一个数据的读取结果是相同的。
隔离型:并发访问数据库时,事务之间不能互相干扰。
持久性:一个事务被提交后,对数据库的数据改变是持久的,即使数据库故障也不应该对其有任务影响。
并发事务会引发的问题
脏数据:多个事务访问同一个数据,造成数据还未修改就被其他事务读取,此时此数据可能是不正确的脏数据。
丢失修改:多个事务访问修改统一个数据,造成第一次修改结果丢失。
不可重复读:一个事务两次读取同一数据,前后读取数据值不一致。(修改)
幻读:同一个事务两次读取一组数据,第二次读取多了不存在的数据。(新增或删除)
事务隔离级别
严格程度由低到高:
read-uncommitted读取未提交
read-committed提取已提交
repeatable-read可重复读
serializable可串行化
InnoDB默认隔离级别为可重读,此级别有可能产生幻读,若使用next-key lock算法,可避免幻读。
默认为行级锁,粒度最小的锁,并发度高,但有可能会产生死锁。
分布式事务中,必须设置为可串行化的隔离级别。
索引
索引是一种用于快速查询和检索数据的数据结构,常见的索引结构:B树,B+树,hash。
优点:大大提高查询速度,唯一索引可保证每条数据的唯一性。
缺点:耗费时间,影响数据库性能,索引需要文件存储,占用空间。
索引底层数据结构
Hash表
由于hash冲突问题、不支持顺序和范围查询,mysql没有使用。
B+树索引
mysql的InnoDB和MyISAM引擎都使用的是B+索引。
MyISAM使用非聚簇索引模式,树中的data存的是数据地址。
InnoDB使用聚簇索引模式,数据文件本身就是索引文件的B+树结构。
大表优化
当单表数据量过大时,数据库读写性能会下降,常见优化措施:
限定查询数据范围:禁止不带查询条件的查询,条件越精确越好。
读写分离:主库负责写,从库负责读。
垂直拆分:把一张列比较多的表分为多张表。(竖着切)
水平拆分:表结构不变,通过某种策略将数据分片。(横着切)
分表对并发优化意义不大因为数据还在同一台机器上,水平拆分推荐分库。
分片常见方案:
客户端代理:在应用端封装jdbc层实现、sharding-jdbc、TDDL
中间件代理:后端和数据库中间增加的代理层,分片逻辑封装在中间件中。mycat、Atlas、DDB
拆分策略:根据主键取模分发
池化设计
线程池,jdbc连接池,redis连接池。
这种设计会初始预设资源,解决重复获取资源的消耗。