mysql面试总结,建议大家时常整理补充一下。这里罗列的是大纲,都是基本工,面试前一定要过一遍,肯定会有一些点忘记了。
就像: start transaction
是否意味着事物真正启动了?可能是根本不知道,也可能是说的乱七八糟,没有提前组织一下语言。。。。。
sql优化
sql优化,这个话题每次面试必须问的问题,为啥?因为现在大部分的web开发都是在写CURD。sql写不好问题就多,sql优化重要性甚至比对语言的熟练度都高。
配置
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
slow_query_time = 1
索引优化
- 索引字段值,区分度高
- 使用联合索引,使用最频繁的放在最左边
- 索引数量不易过多
查询优化
- 有索引但不会用到的情况
- like查询以"%"开头
- where条件不符合最左前缀匹配原则
- 使用
!=
||<>
- 索引列参与运算或使用函数
- 对字段进行null值判断
- 使用or来连接条件
- 所查皆所需
- order by 语句优化
- order by使用索引列
- order by子句不是使用表达式
- join使用索引字段
- union 代替 or
表结构优化
- 表的字段尽可能用NOT NULL
- 垂直拆分,按业务逻辑拆分不同的表
锁
锁的不是每个面试官都问的,但是死锁是经常被问到的
乐观锁
用数据版本(version)来实现
悲观锁
- 共享锁:
lock in share mod
, 其他事务可以读取记录,但是不能修改记录 - 排他锁:
for update
其他事物读该记录时会阻塞,直到此事物结束
死锁
并发产生循环依赖,线程等待对方释放资源
处理策略:
超时:innodb_lock_wait_timeout
检测: innodb_deadlock_detect
事务
事务这个问题,就算不被问到的话,平时用到的还少吗,难到知道 start transaction 然后commit/rollback 就是会事物了?
特性
原子性
隔离性
一致性
持久性
隔离级别
RU:读未提交
RC:读已提交
RR:可重复度
s:可穿行化
世界隔离级别是通过next key lock来实现的
MVCC
提高数据并发能力,读读,读写可以并发进行,
undo log来实现MVCC,每行记录都会有一个trx_id,innodb维护了一个全局活跃读写事物数组,事务初始化时复制一份,获取数组最小事物id,当前事物id,总结来说:
版本未提交,不可见
版本已提交,事物初始化之前提交,可见
版本已提交,事物初始化之后提交,不可见
主从同步
mysql主从同步的问题一般就是: 原理+延迟
原理
主服务器:binlog线程记录下所有的数据变更,写入binlog日志中
从服务器:start slave以后,I/O线程请求主服务器拉去binlog内容,主服务binlog dump响应,存到中继日志中(relay log) 中
从服务器:sql执行线程,执行relay log中的语句
主从同步延时问题
- 一个主库拆分成多个主库,分担写的压力
- 并行复制,多个库并行复制
- 重构代码,业务分离
喜欢可以关注微信公众号