数据库三范式

19.1.2.1.常见索引原则有
1.选择唯一性索引
1.唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。
2.为经常需要排序、分组和联合操作的字段建立索引:
3.为常作为查询条件的字段建立索引。
4.限制索引的数目:
越多的索引,会使更新表变得很浪费时间。
尽量使用数据量少的索引
6.如果索引的值很长,那么查询的速度会受到影响。
尽量使用前缀来索引
7.如果索引字段的值很长,最好使用值的前缀来索引。
7.删除不再使用或者很少使用的索引
8. 最左前缀匹配原则,非常重要的原则。
10. 尽量选择区分度高的列作为索引
区分度的公式是表示字段不重复的比例
11.索引列不能参与计算,保持列“干净”:带函数的查询不参与索引。
12.尽量的扩展索引,不要新建索引。
19.1.3.1.第一范式(1st NF -列都是不可再分)
第一范式的目标是确保每列的原子性:如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)
19.1.3.2.第二范式(2nd NF-每个表只描述一件事情)

首先满足第一范式,并且表中非主键列不存在对主键的部分依赖。 第二范式要求每个表只描述一件事情。
19.1.3.3.第三范式(3rd NF- 不存在对非主键列的传递依赖)
第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。除了主键订单编号外,顾客姓名依赖于非主键顾客编号。
19.1.4.数据库事务
事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 。事务是一个不可分割的工作逻辑单元
事务必须具备以下四个属性,简称ACID 属性:
原子性(Atomicity)
1.事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
一致性(Consistency)
2.当事务完成时,数据必须处于一致状态。

隔离性(Isolation)
3.对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
永久性(Durability)
事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
存储过程优化思路:
1.尽量利用一些sql 语句来替代一些小循环,例如聚合函数,求平均函数等。
2.中间结果存放于临时表,加索引。
3.少使用游标。sql 是个集合语言,对于集合运算具有较高性能。而 cursors 是过程运算。比如对一个 100 万行的数据进行查询。游标需要读表 100 万次,而不使用游标则只需要少量几次读取。
4.事务越短越好。sqlserver 支持并发操作。如果事务过多过长,或者隔离级别过高,都会造成并发操作的阻塞,死锁。导致查询极慢,cpu 占用率极地。
5.使用try-catch 处理错误异常。
6.查找语句尽量不要放在循环内。

 

19.1.7.数据库并发策略
19.1.7.1.乐观锁
乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据;悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度;时间戳就是不加锁,通过时间戳来控制并发出现的问题。

19.1.7.2.悲观锁
悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自己的整个事务提交了,
才释放自己加上的锁,才允许其他用户访问那部分数据。
19.1.7.3.时间戳 时间戳就是在数据库表中单独加一列时间戳,比如“TimeStamp”,每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段加1,提交之前,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存,
这种处理方法虽然不使用数据库系统提供的锁机制,但是这种方法可以大大提高数据库处理的并发量, 以上悲观锁所说的加“锁”,其实分为几种锁,分别是:排它锁(写锁)和共享锁(读锁)。
19.1.8.数据库锁

19.1.8.1.行级锁
行级锁是一种排他锁,防止其他事务修改此行;在使用以下语句时,Oracle 会自动应用行级锁:
1.INSERT、UPDATE、DELETE、SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];
2.SELECT … FOR UPDATE 语句允许用户一次锁定多条记录进行更新
3.使用COMMIT 或 ROLLBACK 语句释放锁。

19.1.8.2.表级锁
表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 与 INNODB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁
(排他锁)。

19.1.8.1.    页级锁
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB 支持页级锁
19.1.10.分区分表

分库分表有垂直切分和水平切分两种。
垂直切分(按照功能模块)
将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日志数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
水平切分(按照规则划分存储)
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如 userID 散列,进行划分,然后存储到多个结构相同的表,和不同的库上。

 

posted @ 2022-07-20 10:41  花心大萝卜li  阅读(75)  评论(0)    收藏  举报