美文网首页
Mysql 复盘

Mysql 复盘

作者: 莫妮卡笔记 | 来源:发表于2021-12-29 18:20 被阅读0次
    image.png

    Mysql 复盘

    一、应用层
    • 主要通过看执行计划来查看是否有笛卡尔积;或者子查询导致全表扫描问题,一般通过加字段加索引、或者组合索引来提高查询效率。
    二、并发事物隔离
    • mysql事物特性主要是ACID 原子性、一致性、隔离性、持久性。

    • mysql 是有四种事物隔离级别、读未提交、读已提交、可重复度、串行化;mysql默认配置是配置到可重复读的级别;业务可根据自己的情况来配置自己的隔离级别。

    • 读未提交:相当于裸奔;当然他的性能也是最好的;没有阻塞等待的情况;这个级别在修改数据的时候;对其他事物读是可见的;比如A事物修改数据name=1 改成name=2 在事物没提交的时候; B事物是能够立即读取到name=2;一旦A事物发生事物回滚;那么B事物读的数据name=2就是脏数据。

    • 读已提交:为了解决【读脏数据】问题;就延伸【读已提交】隔离级别;再回到A事物修改数据name=1 改成name=2 ,在A事物还没提交的时候;B事物读到的还是name=1等A事物 commit后;B事物读到的才是最新的。 那么会导致一个问题;B事物中两次读取的数据不一样。

    • 可重复读:为了解决两次读取不一致问题、mysql引入了MVVC多版本号+undolog来实现;在修改数据前会生成一个快照(版本号tx_id 这个tx_id 会对应undolog快照日志),当事务开启得时候;做一个镜像;所以当事物B 在读name=1的数据;就读开启事务生成得那个快照;这样就可以在保证事务内多次查询返回得结果都一致。

    • 幻读:在并发读的时候A事物查询age=20 ;当B事物insert的时候插入了一条age=20的数据,这个时候会导致age=20在一个事物中第二次读取的时候结果条数不一样。就是所谓的【幻读】情况。

    • 为了解决幻读问题mysql在修改数据的时候加了个间隙锁;其实也就是一个范围比如条件[20,30]之间;只能等待age=20事物提交才能够操作。这个不是特别好理解;要看看B+树的结构才能够理解;本质上就是通过间隙锁+行锁来实现。

    • 串行化:相当于单线程执行效率是最低的、基本不用考虑安全问题。

    • 并发写:在有索引的时候通过行锁来解决;没有索引的情况会对全表进行加行锁;找数据;因为mysql没有索引的情况下没办法定位到那条数据;找到之后再释放其他的行锁。这一加锁、一释放锁对性能很大影响。所以要合理加索引。

    3、binlog/dolog/undolog
    • bin log 二进制日志备份;删除表数据恢复,因为日志是递增得;主从节点都是通过bidlog来同步、或者第三方系统想同步Mysql数据也可以通过bidlog来同步。
    • do log 算是二级缓存日志;用于跟binlog做两阶段确认;对数据读写是一个缓冲区的作用;所有sql的读写操作都是先经过dolog 再到bidlog 。
    • un dolog 日志主要是用户日志未提交;回滚作用;比如MVVC版本号 就是通过undolog来实现,包括seta 分布式事物 也是通过undolog来实现备份回滚。

    4、索引原理/数据结构

    • Mysql数据结构是通过B+树实现;B+树的数据结构纯靠索引去查找;去遍历去比较才能找到最终的值;但在修改;删除的时候会导致索引数数的变化;需要动态去调整树的变化来维持树的平衡。 索引在应用层面都说删除、修改;在大量数据如果有索引的情况下会慢许多;就是这个原因。B+树的时间复杂度是O(logn)
    image.png

    相关文章

      网友评论

          本文标题:Mysql 复盘

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