美文网首页我爱编程
05_数据库优化

05_数据库优化

作者: 七枷琴子 | 来源:发表于2018-05-22 11:42 被阅读0次

    后台开发,和数据库打交道很多,数据库优化也是一个常见的问题?

    事务4个特点:ACID
    ⑴ 原子性(Atomicity)
      原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

    ⑵ 一致性(Consistency)
      一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

    拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

    ⑶ 隔离性(Isolation)
      隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

    即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

    关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

    ⑷ 持久性(Durability)
      持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

    例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

    4大错误:
    脏读,不可重复读,虚度(幻读),

    以上介绍完事务的四大特性(简称ACID)
    数据库4个隔离级别

    现在来看看MySQL数据库为我们提供的四种隔离级别:速度从低到高

    ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

    ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。mysql默认

    ③ Read committed (读已提交):可避免脏读的发生。oracle默认

    ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

    在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

    扩展:乐观锁(锁表,用于镇上该),悲观锁(锁行,用于查询)等等.

    都有哪些优化方式呢?网上资料

    • 1.用PreparedStatement 一般来说比Statement性能高:一个sql 发给服务器去执行,涉及步骤:语法检查、语义分析, 编译,缓存
    • 2.有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
    • 3.表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等
      将姓名和密码单独从用户表中独立出来
      -4.sql语句全部大写,特别是列名和表名都大写。特别是sql命令的缓存功能,更加需要统一大小写,sql语句发给oracle服务器语法检查和编译成为内部指令缓存和执行指令。根据缓存的特点,不要拼凑条件,而是用?和PreparedStatment
      还有索引对查询性能的改进也是值得关注的。
      -5.对访问频繁的数据,充分利用数据库cache和应用的缓存
      -6.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
    image.png
    image.png
    image.png

    真实项目中用过哪些方式呢?结合自己的项目

    -1.在连接数据库的途中加入层层缓存机制,例如ehcache缓存,redies内存数据库,elasticsearch索引库,尽量减少对数据库的访问次数,在深夜流量较少的时候进行索引库自动更新.如果并发过大造成缓存击穿,可以采取固定几率返回固定值来减少数据库压力.不然如果大量访问到数据库的话,数据库基本都会宕机.
    -2.数据分开存放,例如图片存放于单独的图片服务器,客户信息存在于独立的服务器等.

    相关文章

      网友评论

        本文标题:05_数据库优化

        本文链接:https://www.haomeiwen.com/subject/hmrhjftx.html