MySQL经典面试题
提到MySQL 相信很多人都不陌生,MySQL 作为目前最流行的关系型数据库管理系统,在很多的应聘中,都会频繁被面试官问及。于是就自己总结了一些在面试中,经常面试官被提及的一些问题,希望能带给更多人帮助。
接下来就跟着我的步伐来了解一下吧!
公司主营业务:成都网站设计、网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。创新互联推出鹿寨免费做网站回馈大家。
1、MySQL主从复制的原理。
(1)、主库必须开启二进制日志
(2)、当有增删改的语句时,会记录到主库的binlog中
(3)、主库通过IO线程把binlog里面的内容传给从库的relay binlog(中继日志)(这是msyql复制是异步复制的原因)
(4)、从库的sql线程负责读取它的relay log里的信息并应用到数据库中
2、Seconds_Behind_Master的原理。
表示sql线程和io线程之间的时间差
具体的计算:从库服务器当前的时间戳与二进制日志中的事件的时间戳相对比得到的,所以只有在执行事件时才能报告延迟。
不足:
一些错误(例如主备的max_allowed_packet不匹配,或者网络不稳定)可能中断复制,由于主从复制是异步操作,Seconds_Behind_Master可能显示为0
3、主从延迟的主要原因有哪些?
(1)、慢SQL语句过多
(2)、从库的硬件比主库差
(3)、同一个主库下有过多的从库
(4)、网络延迟
(5)、表分区过多
(还有一些原因,欢迎补充)
4、MySQL常见存储引擎及各自特点。
(1)、InnoDB
支持事务、行级锁、支持外键约束,主要面向OLTP的应用,使用next-key locking 的策略来避免幻读现象的产生.
(2)、MyISAM
不支持事务、表锁设计、支持全文索引、读写互相阻塞、不支持外键约束;主要面向OLAP应用场景;缓存池只缓存索引文件,不缓存数据文件
(3)、Memory
将所有数据保存在RAM中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。如果数据库重启或者奔溃,数据都将丢失。
(4)、TokuDB
支持事务、高压缩、告诉读写、基于稀疏树索引设计;支持大多数在线修改索引、添加字段。
(5)、Inforbright/infinidb
列式存储、高压缩、单列查询快
5、innodb_flush_log_at_trx_commit参数0、1和2分别代表什么?
innodb_flush_log_at_trx_commit参数可以控制将redo log buffer中的更新记录写入到日志文件以及日志文件刷新到磁盘的操作时机。
0
每秒一次触发log buffer写入log file中,并且log file刷新到磁盘。
(由于进程调度问题,不能保证每秒100%刷新;如果mysql进程崩溃,可能会丢失1s的事务;效率最高,但最不安全)
1
每次事务提交触发log buffer写入log file中,并且log file刷新到磁盘。
2
每次事务提交,log buffer写入log file中;每秒log file刷新到磁盘。
(如果操作系统崩溃或者停电,可能会丢失1s的事务)
6、Mysql中varchar和char的区别
CHAR列的长度固定为创建表时声明的长度,范围(0-255)
VARCHAR列的长度不固定,范围(0-65535)
7、varchar(50)中的50代表的含义、int(20)中20的含义。
varchar(50)中的50代表最多能存放50个字符
int(20)中20的含义表示显示宽度,跟着zerofill一起才有意义
8、MySQL binlog的几种日志录入格式的涵义、适用场景和在复制中的优劣。
(1)、statement level模式
每一条会修改数据的sql都会记录到master的binlog中,slave在复制时sql进程会解析成和原来master端执行过的相同的sql再次执行。
适用场景:对主从数据一致性要求不太高,并且很少用到函数、存储过程、触发器等场景
优点:bin-log日志量少
缺点:部分新功能(函数、存储过程、触发器)同步会有障碍,比如now()
(2)、row level模式
日志中会记录成每一行数据被修改的形式,然后再slave端再对相同的数据进行修改
适用场景:对主从数据一致性要求比较高的场景。
优点:记录的详细
缺点:binlog日志量过大
(3)、mixed模式
MySQL默认采用statement格式进行二进制日志文件的记录,但是在一些情况下会使用row格式,可能的情况有:
1)、表的存储引擎为NDB,此时对表的DML操作都会以ROW格式记录
2)、使用了UUID(),USER(),CURRENT_USER(),FOUND_ROWS(),ROW_count()等不确定函数时
3)、使用了insert delay语句
4)、使用了用户定义函数(UDF)
5)、使用了临时表
适用场景:对主从数据一致性要求不太高,可能会用到函数、存储过程、触发器等场景
优缺点介于statement和row模式之间
9、重做日志和二进制日志的区别(至少三点)
(1)涉及存储引擎不一样:
binlog记录的是所有存储引擎的操作记录
redo log只记录innodb存储引擎的日志
(2)记录内容不一样:
binlog记录的是关于一个事务的具体操作内容。为逻辑日志
而redo log记录的是每个页更改的物理情况
(3)写的时间不一样:
binlog文件仅在事务提交前进行提交,即只写磁盘一次
而在事务进行过程中,却不断有重做日志条目被写入到重做日志文件中。
10、Explain执行计划中要关注哪些要素?
(1)、type:本次查询表联接类型,从这里可以看到本次查询大概的效率
(2)、key:最终选择的索引,如果没有索引的话,本次查询效率通常很差
(3)、key_len:本次查询用于结果过滤的索引实际长度
(4)、rows:预计需要扫描的记录数,预计需要扫描的记录数越小越好
(5)、extra:额外附加信息,主要确认是否出现 Using filesort、Using temporary 类似情况
以上就是本次的分享,各位读者如果有更好的回答,也欢迎交流!
持续关注,还可获得更多干货分享及免费资源哦!
当前文章:MySQL经典面试题
文章地址:http://azwzsj.com/article/ggigps.html