MySQL优化

一. 为什么MySQL需要优化??

  • 首先其数据存储在磁盘上,读写效率低
  • 其次随着数据增多,处理压力也随之增大
  • 再者数据的处理速度往往就是应用的吞吐量的瓶颈

二. 如何优化MySQL??

  • 项目开发前,对数据库的设计,优先考量最优存储和计算
    •  精度要求,使用decimal     (精确到设置的大小范围)
    •  字段尽可能使用not null    (null数值,计算逻辑复杂)
    •     不要过多字段            (可以有预留字段以备扩展)
    •     符合三范式
      •  字段原子性,默认             (一个字段只存储一项信息)
      •    消除主键部分依赖           (不同的表不要合成一张)
      •    消除对主键的传递依赖    (主键不直接和外键字段关联,因另起字段进行关联)
  • 表的自身优化,即索引
    •  常用普通索引,提高访问速度
    •     索引建议最多不超过6个                       (只对频繁使用的字段设置索引)
    •     避免在条件中对字段进行null值判断     (否则导致引擎放弃索引,直接全表扫描)  
  • 主从复制,读写分离
    •   主服务器处理数据,生成binlog日志,使用日志,实现从服务器的数据同步
    •     使用MyCat读写分离时,操作只对服务器,操作只对服务器
  • SQL语句优化
    •   对于查询,建议在条件的字段上建立索引
    •     避免在条件中对字段 或 != 或 < > 或 or 进行null判断或则表达式操作   (否则导致引擎放弃索引,直接全表扫描)
    •     in 和 not in 慎用                                                                                     (否则导致引擎放弃索引,直接全表扫描)
    •     尽可能使用数值型字段,减少字符型字段                                                (提高查询和连接的性能)
    •     索引建议最多不超过6个                                                                        (索引多,查询而言,优;插入和修改而言,差)
  • 大表拆分
    •     对庞大数据进行分表分库    
      •  水平拆分 : 1000万的大表,分成四张结构相同,平均250万一张的小表
      •    垂直拆分 :  订单表存储在订单库中,用户表存储在用户库中

三. @Transactional 哪些情况下无效??

  •   跨资源访问             (多connction,不是同一个)
  •        spring的事务传播策略 , 在内部方法调用不起作用     (事务注解加到要调用方法上面)
  •        数据库引擎不是InnoDB
  •        注解在protected或private
  •        业务层异常没向上抛出,使用了try...catch吃掉了异常,就没办法知道异常去进行回滚操作
  •        遇到非检查异常,如throwable
  •        不要写在接口上        (spring采用AOP针对具体实现类做的代理实现)

四. 本地事务

  •        必须是同一个连接对象
  •        ACID 事务的四大特征
    •   A 原子性      如何保证??
      •   依靠undo_log表:记录执行的sql语句.如果执行commit 就删除当前记录;如果执行rollback就反执行当前sql.所以必须保证是同一个connction
    •        C 一致性      如何保证??
      •   事务的原子性和隔离性保证了数据的一致性
    •        I 隔离性       如何保证??
      •   设置默认隔离级别REPEATABLE READ(可重复读) + Next-Key Locking,保证了数据库的隔离性
    •   D 持久性     如何保证??
      •   InnoDB存储引擎在启动时不管上次数据库运行时是否正常关闭,都会尝试通过redo log进行恢复操作。
原文地址:https://www.cnblogs.com/bin563597293/p/14362800.html