mysql 按日期拆分成多条记录_mysql 面试大纲

mysql面试总结,建议大家时常整理补充一下。这里罗列的是大纲,都是基本工,面试前一定要过一遍,肯定会有一些点忘记了。

就像: start transaction 是否意味着事物真正启动了?可能是根本不知道,也可能是说的乱七八糟,没有提前组织一下语言。。。。。

49931e98c890962b09899f60eaae3edc.png

sql优化

sql优化,这个话题每次面试必须问的问题,为啥?因为现在大部分的web开发都是在写CURD。sql写不好问题就多,sql优化重要性甚至比对语言的熟练度都高。

配置

slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
slow_query_time = 1

索引优化

  • 索引字段值,区分度高
  • 使用联合索引,使用最频繁的放在最左边
  • 索引数量不易过多

查询优化

  1. 有索引但不会用到的情况
  2. like查询以"%"开头
  3. where条件不符合最左前缀匹配原则
  4. 使用 != || <>
  5. 索引列参与运算或使用函数
  6. 对字段进行null值判断
  7. 使用or来连接条件
  8. 所查皆所需
  9. order by 语句优化
  10. order by使用索引列
  11. order by子句不是使用表达式
  12. join使用索引字段
  13. union 代替 or

表结构优化

  1. 表的字段尽可能用NOT NULL
  2. 垂直拆分,按业务逻辑拆分不同的表

锁的不是每个面试官都问的,但是死锁是经常被问到的

乐观锁

用数据版本(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中的语句

主从同步延时问题

  1. 一个主库拆分成多个主库,分担写的压力
  2. 并行复制,多个库并行复制
  3. 重构代码,业务分离

喜欢可以关注微信公众号

495c44bdbee4507c1f060e5243c90014.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值