Mysql面试可能会问到的基础知识

mysql复制流程
    master的log thread将数据改变写入到binlog里
    --->slave通过i/o thread发请求,master的binlog dump thread将binary log events传送给slave,slave的i/o thread将其写到relay log里
    --->slave的sql thread将relay log apply到库里

MySQL如何保证和监控主从数据一致性的
    5.6 GTID复制,
    5.7 无损半同步复制(rpl_semi_sync_master_wait_point:after_sync)
    pt-table-checksum监控主从数据一致性
    

MySQL如何监控和减少主从延迟的
    5.5的单线程复制--->5.6的多库复制--->5.7的多线程复制    
    pt-heartbeat 监控mysql主从同步延迟
    
Myisam和Innodb的区别:
    1.事务性
    2.innodb锁粒度更细,myisam表级锁,innodb行级锁,并发性更高
    3.innodb支持MVCC(多版本并发控制)
    4.innodb支持外键(但是不建议用)
    5.表类型 innodb是iot,myisam是堆表
    6.myisam会使用一个变量保存表的行数
    7.innodb必须有主键(没有的话innodb也会自动创建一个自增列作为主键)
    
innodb四大特性:
    1.change buffer
        ---记录不在内存中的二级索引页的修改,页面读取到内存后再merge
    2.double write
        ----用来解决页断裂的问题,内存中有double write buffer,系统表空间里对应的有连续的128个页(2个extend,2M),其中120个用于批量刷脏,8个用于single page flush
        ----将随机写变成了顺序写
        ----内存中脏页--->double write buffer--->系统表空间--->磁盘
        ----redo log的最小写入单位是512字节=磁盘IO最小单位,所以不会有页断裂问题 
    3.read ahead
        ----两种预读算法:
            Linear read-ahead:如果InnoDB顺序读取了一个extent的N页,那么innodb会发起一个异步读去读取the entire following extent。由参数innodb_read_ahead_threshold控制页阈值    
            Random read-ahead:如果一个extent中有13个连续不断的页被加载到buffer pool中,innodb会异步发起一个请求去读取该extent的剩下所有页。由参数innodb_random_read_ahead控制页阈值
    4.Adaptive Hash Index
        ----作用是提高检索效率

Mysql5.6 新增特性:
    online ddl、GTID复制、schema级别的多线程复制、memcached NoSQL api、统计信息持久化、buffer pool预热

Mysql5.7 新增特性:
    online ddl支持重命名索引和修改varchar大小、对JSON的支持、sys schema、在线修改buffer pool的大小、并行复制、多源复制
    
varchar(n),int(n):
    varchar(n) n代表字符数,mysql行定义长度不能超过65535 latin1 gbk utf8 utf8mb4
    int(n) n表示显示长度,与存储长度无关   tinyint1 smallint2 mediumint3 int4  bigint8

innodb日志
    redo ---redo log buffer --->ib_logfile
    undo ---undo log buffer --->ib_data* 也可以单独指定innodb_undo_directory、innodb_undo_tablespaces
    
Mysql刷日志规则:
    1.innodb_flush_log_at_trx_commit
    2.innodb_flush_log_at_timeout控制
    3.checkpoint触发
    4.log buffer使用内存超过一般

Mysql刷数据页规则:
    1.checkpoint触发

innodb_flush_log_at_trx_commit和sync_binlog:
    innodb_flush_log_at_trx_commit:log buffer--->os buffer---->ib_logfile
        0--->每次提交写log buffer  每秒写入os buffer并调用fsync()落盘
        1--->每次提交都落盘
        2--->每次提交写到os buffer 每秒调用fsync()落盘
    sync_binlog:binlog_cache--->binlog
        0--->MySQL不控制binlog的刷新
        n--->每n次事务刷新一次

Mysql binlog的格式:
    statement、mixed、row

Innodb的事务隔离级别:
    读未提交、读已提交、可重复读、串行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章