mysql数据库

一、存储引擎

        数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。

        不同的存储引擎提供不同的存储机制、索引技巧、锁。

1.innodb

        InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的,一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。

        

2.联合索引

3.索引失效

        a、数据分布不均匀 (某些值出现频率高,其它值出现频率低)

                举个例子: select * from user_record where username = “张三” and order by ctime desc limit 100;

                这个场景中,如果张三的记录有100万行,呢么加个排序是非常耗费时间的,如果只有100行,即使排序也不耗费时间。

                优化方式是将username 和 ctime 做联合索引。

        b、 索引列被函数处理

        c、执行计划评估成本不走索引比走索引更划算

二、锁机制

表结构锁

        ddl操作会加表写锁,dql和dml会加表读锁,当有线程获取表写锁时候,其它获取表锁线程会被阻塞,所以ddl操作一定要注意。

   表结构写锁优化
        1.copy模式

                创建临时表,将数据插入临时表,对老表和临时表rename

        2.inplace模式(online ddl,锁降级)

                1.拿mdl写锁  - 阻塞读写

                2.降级为mdl读锁

                3.做真正ddl

                4.升级mdl写锁 - 阻塞读写

                5.释放mdl锁

        原理: 通过row log 来记录并发更新语句,以实现在ddl时候可以更新表数据。

        3.instant

                只修改元数据,不会重建表,允许并发dml操作

表意向锁

        意向锁 表锁一种,判断执行是否有ddl正在执行或者阻塞将要执行的ddl

行锁

        1.记录锁

        2.gap锁

            如果只有记录锁,rr级别下使用select for update , 会有幻读情况(对账就会有问题)。即会读到其它新事务提交后修改的值,解决方式时通过select for update 加间隙锁,让其它事务无法修改。

三、事务

一致性视图

对于innodb的rr级别,每个事务都有txid,每一行记录也有txid,

        事务的可见性为 

              行记录的 tx id < 事务txid 且 行记录的事务已提交。  

四、binlog & redolog 

undo log 用于奔溃回滚,mvvc等

redo log 用于奔溃重做

bin log 记录sql语句,用于主从同步

1.wal

        先写undolog, 再写脏页,再写redolog 和binlog。异步将脏页刷到磁盘。

2.如何做到奔溃恢复和回滚

        checkpoint 是脏页刷到磁盘的记录点,对于undolog而言,checkpoint 到 writepos之间的记录需要执行来回滚,对于redolog而言,checkpoint到writepos之间的记录需要重做。

3.如果数据丢失,如何恢复

        1.找到备份的数据文件。

        2.执行备份数据文件后的binlog文件。

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值