1. mysql主从同步的原理,这种方式是同步还是异步?有什么问题?是否有可能发生数据丢失?
原理:master运行时会产生binlog,slave通过单独的io线程,不断的读取binlog,并将其转化为relaylog(中继日志)并执行relaylog
常规的mysql主从同步是异步同步(使用插件除外)
同步过程中如果发生宕机可能会丢失数据,引申出半同步
详情参考:mysql-主从同步 https://www.jianshu.com/p/f08f4265719d
2. mysql热备的搭建过程,使用mysqldump会不会锁表?
通过mysqldump先获取存量数据(导出), 然后在slave上配置master信息追binlog流水
mysqldump --all-databases --master-data=2 --single-transaction --quick -R --events -uroot > /tmp/full.sql
--single-transaction:一致性备份(不会锁表)
-q:采用快速的dump方式(提高导出性能)
-R:导出存储过程,函数,和触发器
--events:如果是5.1以上的版本使用,包含事件
--master-data:在dump过程中记录主库的binlog和pos点(dump出的文件就会多出change master to这个语句),值为1时这个语句会执行,值为2时这个语句是注释状态
3. 谈谈对数据库隔离级别的认识? mysql默认的隔离级别是什么? mysql在默认隔离级别下能防止幻读吗?
四个隔离级别:1.读未提交 2.不可重复读 3.可重复读 4.串行化
mysql的默认级别:RR(可重复读)
mysql在可重复读隔离级别(RR)下没有完全解决幻读问题,通过启用next-key锁(表锁和间隙锁)和MVCC机制来避免幻读。
详情参考:mysql-事务 https://www.jianshu.com/p/f51e1c033ba8
mysql-mvcc https://www.jianshu.com/p/2f5b62d9719b
mysql-锁 https://www.jianshu.com/p/7bfe623cabcf
4. 如果有联合索引(field1, field2) , 当查询语句 select * from test where field2 = xxx; 这个语句是否可以用到索引? 为什么
不能, 最左前缀原则
5. 事务的四个特性分别是什么, 请具体介绍一下?
ACID(原子性,一致性,隔离性,持久性)
注意这里的一致性并不是CAP定理中的一致性
一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。(我也没看懂这句话,大概意思就是俩人转钱,钱的总数要保持一致那么个意思)
6. myisam引擎和innodb引擎的区别有哪些?
innodb支持事务,myisam不支持
innodb支持外键,myisam不支持
innodb是聚簇索引(主键的索引存储了主键值和数据,辅助索引存储了主键的值,也就是说使用辅助索引会查询两次),myisam是非聚簇索引(主键索引和辅助索引都是指向数据的物理位置)
innodb是行锁和表锁(这里注意行锁是上在索引上的),myisam是行锁
innodb不支持全文索引(5.7版本之后支持),myisam支持
innodb要有主键(如果用户没指定会生成个Unique key作为主键)myisam可以没有主键
myisam读要比innodb快(1.innodb要额外维护几个字段实现mvcc 2. innodb寻址要先到页然后到行,myisam直接寻址)
myisam不适合大量插入(myisam是表锁,innodb是行锁)
7. mvcc特性实现的原理是什么?
1 快照读 2 undolog 3 每行隐藏的创建版本号与过期版本号
详情参考:mysql-mvcc https://www.jianshu.com/p/2f5b62d9719b
8. select * from test_table where field = xxx limit 1 for update, 这条语句是什么意思? 如果field字段上没有索引, 会锁住一条记录还是全表锁住?
加读锁(行级),没索引会锁全表(再次强调,锁是锁的索引)
9. 如何优化一条sql, 谈谈执行计划
explain,不细说
10. redis的持久化方式有哪些? 每种持久化方式的优点和缺点是什么?
aof 和 rdb。rdb是每隔一段时间,备份所有数据(快照)。aof是记录命令(增量)。
现在redis是采用aof+rdb的方式来持久化(两次快照之间使用aof来持久化,也就是说先读rdb恢复到上个时间节点,然后使用aof增量来进一步恢复)
rdb优缺点:优点:快照备份快,恢复也快。缺点:停机会丢失很多数据。。。
aof优缺点:优点:很精确,就算是停机也就丢几秒的数据。 缺点:频繁fsync(毕竟会记录每条命令啊)恢复也慢
11. mysql为什么要使用b+树?
同二叉树相比,b-树更矮胖(m阶b+树,每个中间节点包含k-1个元素并有k个孩子,每个叶子节点包含 k-1个元素),可以减少IO次数
同b-树相比,b+树的数据只存储在叶子节点上。且叶子节点之间增加了链表,这样获取节点时,不用中序遍历,这样便于快速定位数据,是减少磁盘IO的最佳方式。
12. 索引失效的几种情况:
1.条件中有or,即使其他条件带索引也不会使用
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换 (where age = "10" 表中存的是int,但是sql写成string)
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(优化器会计算成本,然后选择方案,如果结果集太大,mysql会认为扫描全表更划算)
13. 超大数据量分页:
select * from orders o
inner join
(select id from orders where created_at between '2019-10-17' and '2019-10-25' limit 1000000, 10) e
on o.id = e.id;
通过使用覆盖索引查询返回需要的主键,再根据这些主键关联原表获得需要的行,这样可以减少mysql扫描那些需要丢弃的行数
14. 平均分:
SELECT id,NAME,AVG(score) FROM stu GROUP BY NAME HAVING AVG(score) < 60 //平均分不及格的人
15. mysql主从复制延迟过大解决方案:
1. MySQL之前是单线程复制,5.7版本推出多线程复制
2. 分库(不同的业务使用不同的数据库)
3. 硬件升级
网友评论