1.能不能只用binlog不用relo log?
2.binlog 两阶段提交过程是怎么样的?
3.update语句的具体执行过程是怎样的?
4.mysql的explain有什么作用?
5.给你张表,发现查询速度很慢,你有那些解决方案
6.如果Explain用到的索引不正确的话,有什么办法干预吗?
7.MySQL主从复制了解吗
8.主从延迟都有什么处理方法?
9.分表和分库是什么?有什么区别?
10.讲一下Redis底层的数据结构
1.能不能只用binlog不用relo log?
bin log是 server 层的日志,没办法记录哪些脏页还没有刷盘,只适用于主从复制和数据备份。
redo log 是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复。
2.binlog 两阶段提交过程是怎么样的?
事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。因此,采取两阶段提交的方法,是为了保证两份日志之间的一致性。
bin log后写,若中途发生宕机等情况,再用bin log 进行备份,会出现主库和备份库不一致的情况。
redo log后写,同样发生意外,因为redo log没有写入,那么崩溃恢复并没有办法恢复到bin log记录的情况,这时再备份,同样出现主库和备份库不一致的情况。


3.update语句的具体执行过程是怎样的?
Client客户端:
客户端通过tcp/ip发送一条sql语句到server层。
Server层:
接收客户端过来的请求,连接器进行权限验证;
权限验证通过后,解析器会对SQL语句进行词法、语法分析等;
经过验证解析的SQL语句会在优化器生成选择最优执行计划;
然后执行器将会执行经过优化的SQL语句;
InnoDB引擎层:
调用存储引擎接口后,会先从Buffer Pool获取数据页,如果没有就从磁盘中读入Buffer Pool,然后判断更新前后的记录是否一样;
开启事务,修改数据之前先记录undo log,写入Buffer Pool的undo page;
开始更新page data中的记录,被修改的数据页称为脏页,修改会被记录到内存中的 redo log buffer中,再刷盘到磁盘的redo log文件,此时事务是 perpare阶段(写到缓存,redo log,刷盘);
脏页不会立即写入磁盘,而是由后台线程完成,这里会用double write来保证脏页刷盘的可靠性;
还没结束呢,这时候可以通知Server层,可以正式提交数据了, 执行器记录binlog cache,事务提交时才会将该事务中的binglog刷新到磁盘中;
这个时候Update语句完成了Buffer Pool中数据页的修改、undo日志、redo log缓存记录,以及记录binlog cache缓存
commit阶段,这个阶段是将redo log中事务状态标记为commit;
此时binlog和redo log都已经写入磁盘,如果触发了刷新脏页的操作,先把脏页copy到double write buffer里,Double Write Buffer 的内存数据刷到磁盘中的共享表空间 ibdata,再刷到数据磁盘上数据文件 ibd;
流程完结;
4.mysql的explain有什么作用?
explain 是查看 sql 的执行计划,主要用来分析 sql 语句的执行过程,比如有没有走索引,有没有外部排序,有没有索引覆盖等等。
5.给你张表,发现查询速度很慢,你有那些解决方案
1.分析查询语句:使用EXPLAIN命令分析SQL执行计划,找出慢查询的原因;
2.创建或优化索引,避免索引失效:根据查询条件创建合适的索引;
3.查询优化:避免使用SELECT *,只查询真正需要的列;使用覆盖索引,即索引包含所有查询的字段;
4.优化数据库表:如果单表的数据超过了千万级别,考虑是否需要将大表拆分为小表;
5.缓存:引入缓存层,如Redis,存储热点数据和频繁查询的结果。
6.如果Explain用到的索引不正确的话,有什么办法干预吗?
可以使用 force index,强制走索引。
7.MySQL主从复制了解吗?
MySQL 的主从复制依赖于 binlog ,也就是记录 MySQL 上的所有变化并以二进制形式保存在磁盘上。复制的过程就是将 binlog 中的数据从主库传输到从库上。

8.主从延迟都有什么处理方法?
强制走主库方案:对于大事务或资源密集型操作,直接在主库上执行,避免从库的额外延迟。
就是从库只起到备份作用?参考


9.分表和分库是什么?有什么区别?
一个是为了解决高并发,但数据库扛不住,一个是为了提交查询效率。

分库与分表可以从:垂直(纵向,按列分)和 水平(横向,按行分)两种纬度进行拆分。
10.讲一下Redis底层的数据结构?
常见的有五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。
随着 Redis 版本的更新,后面又支持了四种数据类型:BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。

602

被折叠的 条评论
为什么被折叠?



