java架构师之路-高性能mysql(一)

/ java / 1 条评论 / 462浏览

1.mysql的逻辑架构

    

2.如何选择正确的存储引擎

    除非需要用到InnoDB不具备的特性,并且没有其他方案可以代替,否则都应该优先选用InnDB引擎;

    不建议使用多种引擎混合,否则则会带来一系列问题,例如事物只会回滚一部分;

    选用InnoDB的理由:

    1.支持事务,比如订单相关操作是需要强事务保证的;

    2.备份,InnoDB支持在线热备份;

    3.崩溃恢复,MyISAM崩溃后发生损坏的概率要比InnoDB高太多;

    4.性能,综合来看,由于MyISAM不支持行级锁,经常锁全表,性能较差;

    当然MyISAM也不是一无是处的,会压缩表,节约存储空间;支持全文索引(InnoDB5.6 以上也支持全文索引);对于只读的数据,倒是可以考虑用MyISAM,插入性能较好,例如日志型应用;

3.数据类型优化

    1.尽量选择更小的数据类型,确保够用;

    2.选择更简单的数据类型,比如整型代替字符串,枚举代替字符串;

    3.尽量避免NULL,可为null的列使得索引变得更为复杂,每个索引记录需要一个额外的字节;

    ps:datatime和timestamp都可以存时间精确到s,但是timesatmp只占用datetime一半的空间;

4.反范式设计

    为了优化速度,有时候会加入冗余字段或者缓存表避免过多的关联或者统计查询;但是会带来更高的数据维护成本;

5.各种锁

    共享锁:即读锁;

    排它锁:即写锁;

    意向锁:(共享锁、排它锁):表级锁,但是只是表示事务正在读/写某一行记录,并不是锁住整张表;在给一行记录加锁前先要给该表加意向锁,如果要对全表加锁,则不需要去遍历查找是否有部分记录已加锁,可以直接通到意向锁感知;是mysql内部自己实现的,为了方便检测行级锁和表级锁的冲突;

    间隙锁:不仅仅锁定查询涉及的行,还会对索引中的间隙进行锁定(例如范围查找),已防止幻读行的插入;

    

  1. 点击java架构师之路-高性能mysql(四) 失败了,可以发个链接吗

    回复