• 7.数据库


    一、三大范式:

    第一范式:每一列都是不可拆分的

    第二范式:在第一范式的基础上,属性完全依赖于主键

    第三范式:属性不能传递依赖于主属性

    https://blog.csdn.net/qq_15037231/article/details/61628143

    二、主键

    <1>自增ID

    优:数据库自动增加,int/bigint,SQL Server默认聚集索引,空间小,可以有业务意义

    劣:多库环境、不同环境的数据库ID冲突;容易泄露信息

    <2>Guid

    优:GUID程序生成的,全球唯一,插入数据库,不会错误的join,无限的,方便导入

    劣:空间大,没有自身含义,没有聚集索引(创建时间来聚集),查询效率比较低

    三、外键

    优:外键做数据关联,级联删除,有严格数据关系的时候用外键

    劣:导入麻烦,增删改时数据库多一步操作

    合理使用:尽量少的使用外键,大型互联网项目瓶颈一般都在数据库,尽量少的让数据库做事

    四:数据库事务

    多条sql作为一个整体提交给数据库系统,要么全部执行完成,要么全部取消,是一个不可分割的逻辑单元

    原子性:要么都成功,要么都失败

    一致性:事务执行完,数据都是正确的

    隔离性:两个事务同时操作同一张表,B事务要么是在A事务前完成,要么在A事务完成时执行(锁表)

    持久性:数据提交后 就固化下来

    五、锁

    1.乐观锁 (通过程序设计,高性能)

    1)认为没有并发,读取数据--修改--保存(没有锁),通过数据判断

    2)更新的时候做一个判断,需要一个判断维度(时间戳/long数字),就判断这个时间戳

    先查询--再更新,查询出来以后,得到时间戳,在更新的时候加1(规则统一),判断加1之后的数据是否大于之前的时间戳,大于则正常更新,否则这个数据被修改过,就不能操作--失败了

    3)规则需要统一

    2.悲观锁(基于数据库锁机制完成,影响性能)

    1)认为任何时候都可能多线程并发,认为我们在操作某一条数据的时候,刚好别人在操作

    2)共享锁 S锁 读锁,允许别的事务来读,但是不允许修改;读完就释放,锁定数据页(除非holdlock就一直锁定)

    3)排他锁 X锁 写锁,准备写数据,不允许读也不允许写---insert

    4)行锁  where id=123

    5)表锁   where 1=1

    3.如何避免死锁

    死锁其实完全避免不可能;更多的是降低死锁的概率

    1)不用锁就不会死锁,建议使用乐观锁(高性能)

    2)统一操作顺序,先A后B再C,在系统中所有的操作都需要统一顺序

    3)最小单元锁,锁里面尽量减少操作

    4)避免事务中等待用户输入,避免在事务中等待时间过久

    5)减少数据库并发---微服务

    6)分库分表表分区

    7)降低事务级别

    8)设置死锁时间 set lock_timeout(锁超时时间)

    六、存储过程

    存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。可以独立的来完成业务逻辑计算,就类似于在程序中的某一个方法,单纯从数据库角度来说,就像在数据库中定义的用来处理业务逻辑的Api

    存储过程的优势:

    1.存储过程允许标准组件式编程,每一个业务逻辑的处理都可以独立定义成一个存储过程,面对一些业务逻辑的更新,其实只需要修改数据库存储过程即可

    2.存储过程能够实现较快的执行速度

    3.存储过程减轻网络流量

    4.存储过程可被作为一种安全机制来充分利用

  • 相关阅读:
    HA分布式集群二hive配置
    win下写任务提交给集群
    win10下将spark的程序提交给远程集群中运行
    Scala快学笔记(三)
    Scala快学笔记(二)
    Scala快学笔记(一)
    统计学习方法 三 kNN
    统计学习方法 二 感知机
    fluent python(一)
    Codewar (1)
  • 原文地址:https://www.cnblogs.com/bjhblogs/p/12743237.html
Copyright © 2020-2023  润新知