一、存储引擎
数据库管理系统(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文件。