大家好,我是Tom哥~
为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于mysql数据库,面试官一般喜欢问哪些问题
接下来,我们逐条来看看每个问题及答案
MyISAM 和 InnoDB 的区别?
答案:InnoDB 支持 事务、外键、聚集索引,通过MVCC来支持高并发,索引和数据存储在一起。InnoDB 不保存表的具体行数,执行 select count(*) from table
时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数。
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁,并发能力低。MySQL 将默认存储引擎是 InnoDB
mysql 锁有哪些类型?
答案:mysql锁分为共享锁( S lock ) 、排他锁 ( X lock ),也叫做读锁和写锁。根据粒度,可以分为表锁、页锁、行锁。
什么是间隙锁?
答案:间隙锁是可重复读级别下才会有的锁,mysql会帮我们生成了若干左开右闭
的区间,结合MVCC和间隙锁可以解决幻读问题。
如何避免死锁?
答案:死锁的四个必要条件:1、互斥 2、请求与保持 3、环路等待 4、不可剥夺。
数据库的隔离级别?
答案:读未提交、读已提交、可重复读(mysql的默认级别,每次读取结果都一样,但是有可能产生幻读)、串行化。
Mysql有哪些类型的索引?
答案:
覆盖索引
什么是覆盖索引和回表?
答案:
1、覆盖索引,指的是在一次查询中,一个索引包含所有需要查询的字段的值,可能是返回值或where条件
select buyer_id from order where money>100
假如我们创建了一个(money,buyer_id)的联合索引,索引的叶子节点包含了buyer_id
的信息,则不会再回表
查询。
2、回表,指查询时一些字段值拿不到,需要到主键索引B+树再查一次。
Mysql的最左前缀原则?
答案:即最左优先,在检索数据时从联合索引的最左边开始匹配,直到遇到范围查询(如:> 、< 、between、like等)
例子:where a = 1 and b = 2 and c > 3 and d = 4 ,如果建立(a,b,c,d)组合索引,d是用不到索引的;如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
线上SQL的调优经验?
答案:
slow_query_log
日志中收集到的慢 SQL ,结合 explain
分析是否命中索引。官方为什么建议采用自增id 作为主键?
答案:自增id是连续的,插入过程也是顺序的,总是插入在最后,减少了页分裂,有效减少数据的移动。所以尽量不要使用字符串(如:UUID)作为主键。
索引为什么采用B+树,而不用B-树,红黑树?
答案:提升查询速度,首先要减少磁盘IO次数,也就是要降低树的高度。
页
为单位读取,每个节点一页,但是二叉树每个节点储存一个关键词,导致空间浪费。指针
少很多,无形增加了树的深度。健值+指针
,索引树更加扁平,三层深度可以支持千万级表存储。同时叶子节点之间通过链表关联,范围查找更快。事务的特性有哪些?
答案:ACID。
如何实现分布式事务?
答案:
日常工作中,MySQL 如何做优化?
答案:
limit 100000,10
先查找起始的主键id,再通过id>#{value}
往后取10条覆盖索引
,索引的叶节点中已经包含要查询的字段,减少回表查询
mysql 主从同步具体过程?
答案:
log dump 线程
通知slave有数据更新binlog
存到本地的Relay log
中继日志中SQL 线程
读取Relay log
事件,并在本地执行redo
操作。将发生在主库的事件在本地重新执行一遍,从而保证主从数据同步什么是主从延迟?
答案:指一个写入SQL操作在主库执行完后,将数据完整同步到从库会有一个时间差,称之为主从延迟。计算公式:
t2-t1
,就是延迟时间注意:不同服务器要保持时钟一致
主从延迟排查方法?
答案:通过 show slave status
命令输出的Seconds_Behind_Master
参数的值来判断
主从延迟要怎么解决?
答案:
canal
增量订阅&消费组件,缓解主库压力。slave_parallel_workers
为一个大于0的数,然后把slave_parallel_type
参数设置为LOGICAL_CLOCK
如果数据量太大怎么办?
答案:mysql表的数据量一般控制在千万级别,如果再大的话,就要考虑分库分表。除了分表外,列举了面对海量数据业务的一些常见优化手段
分表后ID如何保证全局唯一呢?
答案:分库分表后,多张表共用一套全局id,原来单表主键自增方式满足不了要求。我们需要重新设计一套id生成器。特点:全局唯一、高性能、高可用、方便接入。
incr
命令实现ID的原子性自增。分表后可能遇到的哪些问题?
答案:分表后,与单表的最大区别是有分表键sharding_key
,用来路由具体的物理表,以电商为例,有买家和卖家两个维度,以buyer_id
路由,无法满足卖家的需求,反之同样道理。如何解决?
seller_id,order_id,buyer_id
等几个简单关系字段即可,以seller_id
作为分表键