在DBA工作中遇到的问题千奇百怪,可能有些问题是比较常见的,我们一下子就能知道其中的问题关键点所在,但是有些问题的出现并不一定我们可以很快的了解到其中的根本问题,所以需要总结工作中需要用到的知识点,经常查一查看一看。
MYSQL 知识点
- MYSQL的WAL机制(日志先行),主要涉及到redolog、logbuffer,redolog的刷盘机制,由参数innodb_flush_log_at_trx_commit 控制 · 当值为0,提交事务不会刷盘到redolog,需要每隔一秒的后台线程,将logbuffer 写到操作系统的cache,并调用fsync落盘,性能最好,但是可能会丢1s的数据 ,这个配置主要用到了,多个事务共同提交,所以性能比较好 · 当值为1,提交事务就刷到操作系统cache,并且调用fsync落盘,性能最差,但是可以保证不丢失数据,这是默认配置 · 当值为2,提交事务就刷到操作系统cache,但是不调用fsync落盘,而是每间隔1秒调用fsync落盘,这种的话可以保证数据库宕机数据不丢失,但是服务器如果挂了就丢1s数据 (补充一下redolog不需要双写,因为redolog写入磁盘是512字节,已经是系统io的最小单位了,不会出现宕机数据写入一半问题)
- mysql 双一机制 这里主要说一下log-sync 设置为0,类似与把日志交给操作系统去自动刷新,log-sync为N>0相当于有N个事务提交之后统一刷新到磁盘中,这种方式相当于组刷盘比较快
- MYSQL 的双写机制。 · 为什么要存在双写呢?因为如果buffer pool 直接把脏数据从内存写入到数据库中,但是数据库存在磁盘中,磁盘中一个数据库大小为最大为4k,那么mysql内存中一个数据页为16k,16k在往4K页面写入数据时候要分4此io,那么如果这4此io只写进去了8k,那么在数据恢复时候会造成数据不一致问题,所以开发出来了双写机制如下图
第一步、如果有脏数据要刷盘先拷贝到doublewrite buffer中。第二步、接着从两次写缓冲区分两次写入磁盘共享表空间(顺序写),每次写1M。第三步、把脏数据离散写到实际的数据文件中 双写崩溃恢复只需要把doublewrite中找到最近的副本,将其复制到表空间文件,在应用redolog就完成mysql的恢复
- ICP(索引下推),举个栗子
SELECT * FROM people WHERE zipcode='95054' AND lastname LIKE '%etrunia%' AND address LIKE '%Main Street%';
如果有一个复合索引 zipcode,lastname 上边这个sql你会发现其实呢lastname不能走索引,因为他不满足最左前缀原则,但是mysql发明了ICP,可以在不回表的条件下,把复合索引zipcode,lastname 通过 lastname like '%etrunia%' 在进一步过滤,进一步减少回表的行数,这种在复合索引中把where条件中不满足走这个复合索引的条件进行filter操作,叫ICP;