业务工具杂谈(二)之Mysql

97 阅读3分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

MYSQL

2.1 存储结构

  • 事务:

    • InnoDB支持事务
    • MyISAM不支持事务,这也是Mysql将默认引擎切换的主要原因之一
  • 外键

    • InnoDB支持事务
    • MyISAM不支持事务,如果将包含外键的InnoDB转换为MyISAM会失败
  • 索引

    • InnoDB是聚簇索引:

      • 文件存放在主键索引的叶子结点,因此必须有主键,通过主键索引会很快
      • 辅助索引需要两次查询,因为辅助索引存储的是主键Id,再通过主键索引去查询
      • 因此主键不应该设置太大,不然其他索引也会很大
    • MyISAM是非聚簇索引

      • 数据文件是分离的
      • 索引保存的是数据文件的指针
      • 主键索引和辅助索引是分离的
  • 行表锁

    • MyISAM是表锁,操作一条数据也会对整个表锁住;并发访问受限
    • InnoDB是行锁,这也是Mysql转换默认存储引擎的重要原因之一
  • 行数

    • InnoDB不存储表的行数,所以执行 select count( * ) 语句时,会全表扫描,最后返回总数量

    • MyISAM内部维护了计数器,并把表的总行数存储在磁盘内,需要的时候直接调用即可

    • 总结:MyISAM比InnoDB快,为什么不像MyISAM一样,存储在磁盘?

      • InnoDB中,数据量越来越大的时候,因为是全表扫描,性能会很低下;

      • 为什么不像MyISAM一样存储在磁盘呢,这根Mysql 的事务特性有关,由于多版本并发控制(MVCC)的原因,InnoDB应该返回多少行也不确定

      • MVCC:多版本并发控制,也就是确保事务在当前时间段内不会遭到改变,通过在数据库内隐藏字段实现,版本号

后续关于Mysql的索引会在下一篇详细介绍

彩蛋

策略模式

根据不同类型采取不同的解析方式

对if / else 和 switch / case 进行解耦

1.1为什么不用if /else 和 switch / case

  • 如果日后分支变多,业务有改动,那这个判断的代码将会变得臃肿,难以维护,可读性差

  • 如果需要接入新的业务,需要在原有的代码上继续叠加(屎山跳舞)

  • 用专业的话就是违背了面向对象编程的开闭原则和单一原则

    • 开闭:拓展开放,修改封闭
    • 单一:修改业务逻辑需要在原有代码修改

1.2实战使用

业务上是与硬件传感器交接,抛开连接框架(emqx)与连接协议(mqtt);还是Netty和808

当数据消息上发到服务端,都是要经过业务层去分发到不同的设备service,走不同的逻辑处理

  • 利用接口或者抽象类,里面都是两个方法,

    • 一个是用枚举类,存放不同的业务(判断走向)
    • 一个是实现方法,业务逻辑
  • 实现ApplicationContextAware 接口(通过上下文环境对象获得spring容器内的bean),用一个HashMap存放相应的判断条件和业务逻辑处理,通过不同的条件,调用map里面不同的value实现类