mysql优化几个步骤笔记

转 孤独烟 打杂的ZRJ     https://mp.weixin.qq.com/s/FG5KfyBfhonwrk7-ZOiEiQ

步骤一:建立索引与优化sql语句

    首先用慢查询日志定位执行较慢的sql语句

    利用explain分子语句

    建立索引优化或优化sql语句

步骤二:搭建缓存(缓存过期时间保证最终一致性,但并不保证绝对一致性,根据cap原则,高可用与高一致性)

    数据库和缓存双写一致性问题:

      先删除缓存,再更新数据库:

          线程一删除缓存,线程二读取缓存不存在去数据库读取,再设置缓存,线程一更新数据库,缓存与数据库不一致,脏数据,

          解决方案,删除与更新数据库操作后,线程一休眠一秒,然后再删除缓存,把这一秒的脏数据删除(双删策略)

          若是采用主从同步读写分离:也采用双删延时策略,加上主从同步时间

          该策略不好的地方:若是第二次删除失败怎么办,后面读到的都是脏数据

      先更新数据库,再删除缓存:

          也会发生高并发下的脏数据问题,但概率较低:缓存刚好失效,线程一更新数据库,线程二查询缓存失效查询数据库得到旧值,

          线程一删除缓存,线层二更新缓存,得到脏数据,但是线程二更新缓存会发生在线程一删除缓存之前,因为更新数据库操作慢于查询操作

    缓存击穿,缓存穿透,缓存雪崩:高并发绕过缓存将查询全部怼在数据库上

步骤三:读写分离(主从复制读写分离)(引用层解决或者上mycat)

    主从架构问题:

      主从好处:实现备份,负载均衡

      主从实现:主库开log dump线程将binllog发送给从库,从库开io线程将binlog写入relay log,再开sql线程执行relaylog里面的sql语句

      主从架构的若已执行问题,要提高一致性还是用缓存吧

步骤四:分区(这浑水我不趟)

步骤五:利用mycat实现分表知道的不多(能不分表就不分表,减少join语句)