Mysql面试全解
2021-07-08 11:07:49 4 举报
AI智能生成
Mysql重要概念、常见问题、常见面试点全罗列
作者其他创作
大纲/内容
更新Sql如何执行
日志
innodb引擎层日志:redo log<br>
Mysql server层日志:binlog
WAL:whrite ahead logging<br>
两阶段提交<br>
解决Mysql问题经历
索引统计信息cardinate不准确导致的问题,通过analyze table<br>
常见问题
如何安全的给表加字段?
怎么解决热点行更新导致的性能问题呢?<br>
并发时如何安排事务语句?
分析在各隔离级别下,更新没加索引的行时锁的表现?
选择唯一索引还是普通索引?
如何给字符串加索引?
为什么删除表数据,表文件大小不变?<br>
count(*)还是count(1)还是count(id)<br>
为什么Mysql为抖一下?
索引失效案例<br>
自增主键为什么会不连续?
常用概念
explain<br>
rows显示最多扫描多少行
limit
执行器判断是否需要next
cardinate
基数统计(区分度):通过抽样数据页平均值计算得出,<br>数据更新量到达一定阈值会触发重新统计<br>
InnoDB刷脏页机制<br>
后台线程自动刷
数据页LRU淘汰时刷
刷脏页两种极端场景:<br>1.一个查询要淘汰的脏页太多,导致响应时间明显边长;<br>2.redo log写满,更新全部堵住;<br>
刷脏页控制策略<br>
innodb_flush_neighbors连坐机制
InnoDB缓冲池
Mysql的核心理念就是能用内存就用内存,无论是读写数据还是log,<br>因此buffer pool实际上就是一个内存管理器的理念存在的<br>
online DDL
order by
排序机制
排序优化
filesort
全字段排序<br>
rowid排序<br>
temporary
磁盘临时表
内存临时表<br>
MRR<br>
join
一条查询Sql工作过程
连接器<br>
与客户端建立链接、获取权限、管理维持链接,连接默认8小时,断开需要重连
尽量使用长连接
Mysql执行过程中的临时内存建立在连接对象内,可能导致OOM<br>
Mysql查询缓存<br>
分析器<br>
词法分析<br>
语法分析<br>
优化器<br>
作用:在表里有多个索引的时候,决定使用哪个索引
选错索引的解决方法:<br>1:强制走索引;<br>2:通过修改sql引导优化器;<br>3:增加或删除索引绕过问题;<br>
执行器<br>
limit 是执行器得到结果之后判断是否需要 Next,不能决定优化器的索引选择
事务隔离
事务隔离级别
ru:读未提交
rc:读已提交
每个语句都生成一致性视图
语句执行过程中加上的行锁,在语句执行完成后,<br>就要把“不满足条件的行”上的行锁直接释放了,不需要等到事务提交<br>
rr:可重复读
场景:如对账期间不希望看到最新的数据<br>
1.核心:一致性读,根据row trx_id和一致性视图确定数据版本的可见性;<br>2.事务更新时当前读;<br>3.当前行的行锁被占,需要等待锁;<br>
事务开启时生成一致性视图
可重复读隔离级别遵守两阶段锁协议,所有加锁的资源,<br>都是在事务提交或者回滚的时候才释放的<br>
serilazable:串行化<br>
事务隔离的实现
每条记录被更新时都会记录一条回滚记录,<br>其他事务要看到可重复读的结果都是通过回滚记录回滚得到的<br>
MVCC:多版本并发控制
数据库的每条记录可能存在多个版本<br>
用于支持RC和RR隔离级别的实现<br>
没有物理结构,用于在事务期间决定“能看到什么数据”<br>
快照是基于整库的,基于“所有数据都有多个版本”特性来秒级创建<br>
实现:InnoDB为每个事务创建一个数组,用以保存这个事务启动瞬间当前正在活跃的所有事务id<br>
数据版本的可见性规则
更新数据都是先读后写的,不能在历史版本上去更新,所以这个读只能读最新值,称为当前读;<br>
select ... lock in share mode;<br>
select ... for update;<br>
update
事务id
每个事务都有一个唯一自增的transaction id
1. 每行数据都有多个版本,每次事务更新数据时,会生成新的数据版本<br> 并把trasaction id赋值给该行的数据版本的事务id:row trx_id<br>2. 新的数据版本可以拿到旧的数据版本;<br>3. 旧的数据版本是通过新的数据版本+undo log一步一步还原得到;
生成事务id<br>1. begin transaction后等到第一个语句执行时生成;<br>2.start transaction with consistent snapshot 立即生成;
索引<br>
索引的常见数据结构
Hash表<br>
优势:添加、删除快<br>劣势:索引无序导致区间查询慢,需要扫全表<br>适用场景:等值查询<br>
有序数组
优势:等值查询和区间查询很快,等值查询时O(logn)<br>劣势:更新慢<br>适用场景:静态表<br>
搜索树<br>
为什么不用平衡二叉树?<br>
为什么要用N叉树?
InnoDB分叉树是怎么计算的?<br>
B+树
InnoDB索引模型<br>
表按照主键顺序以索引的形式存放,也叫索引组织表<br>
主键索引(聚簇索引)
非主键索引(二级索引)<br>
普通索引
change buffer<br>
唯一索引
回表:先查二级索引在查主键索引,多扫描一次索引树<br>
索引维护<br>
为什么推荐使用主键索引?
索引常见问题
分析sql扫描行数, 表T中k是普通索引<br>select * from T where k between 3 and 5;<br>
如何避免回表?
覆盖索引
建立联合索引时如何安排字段顺序?
索引长度越大,数据页存放的索引值越少,查找效果越差<br>
最左前缀原则<br>
索引下推
前缀索引
场景:字符串取区分度高的前缀部分作为索引,能够节省空间
前缀索引会影响覆盖索引:<br>1.通过前缀索引匹配到数据后,需要回表确认字段是否完全一致,<br>2.覆盖索引的优化就是为了减少回表<br>
劣势:增加查询扫描次数<br>
锁
锁范围分类<br>
全局锁(库锁)
使用场景:数据库逻辑备份<br>
FTWRL:flush table with read lock; <->unlock tables;<br>
表级锁
表锁
lock tables T read/write;<->unlock tables;
元数据锁MDL<br>
MDL锁是针对元数据的,无需显式使用,自动添加<br>
读锁不互斥,允许同时DML,阻塞所有DDL操作<br>
写锁、读写锁互斥,只有拥有锁的线程可以DDL、DML,<br>其他线程阻塞DDL和DML操作
申请MDL锁的操作会形成一个队列,<br>队列中写锁获取优先级高于读锁,一旦线程在申请写锁,后续所有操作都将阻塞<br>
行级锁<br>
间隙锁
gap lock 前开后开区间()<br>
next key lock = gap lock +行锁,前开后闭区间(]
rr级别下加锁原则
结构
表空间<br>
逻辑容器,可以划分为 系统表空间、用户、临时、撤销<br>
nnoDB有两种表空间类型:共享表空间和独立表空间<br>
段<br>
1.段是数据库的分配单位,且不要求段中的区与区必须连续。<br>2.不同数据库对象以不同的段形式存在,也就是说创建一个表时会创建一个表段,创建一个索引时会创建一个索引段。<br>3.一个段只能属于一个表空间。<br>
区<br>
一个区默认分配64个连续的页,1M<br>
页
数据库IO最小单位,默认16K<br>
行<br>
自由主题
0 条评论
下一页