Mysql相关 (https: xiaolincoding.com mysql )

1, explain命令的各个字段解释

关键字段:

type 查询方式

  • ✅ 优秀: system, const, eq_ref, ref
  • ⚠️ 可接受: range, index_merge
  • 🔴 需要优化: index(全索引扫描), ALL(全表扫描)

extra 数据处理方式

索引相关
Using index
Using index condition (用到了联合索引的一部分查找,另一部分在索引树上过滤)
Using where (先走索引查找,然后在服务层过滤, 可以通过联合索引优化到Using index condition)   ----  中优先级   
排序相关
Using filesort  (order by后面的字段需要添加索引)              ----  高优先级   
Using temporary  (distinct使用覆盖索引优化,避免临时表的产生)  ----  高优先级
连接相关
Using join buffer (Block Nested Loop)(被驱动表的连接字段上创建索引)                         ----- 中优先级
Using MRR (Multi-Range Read)
其他
Impossible WHERE
Select tables optimized away
Distinct 
No tables used

rows 扫描行数

key 实际使用的索引

filtered 引擎返回的数据100条,过滤后剩下的数据的百分比20,即剩下数据为100*20% = 20条,越低表示引擎的过滤效果越差

key_len 可以分辨联合索引是否部分使用到了

2, Innodb和Myslam的区别

事务
行锁/表锁
外键
崩溃恢复
count(*)
聚簇索引和索引数据分离
myslam不支持事务,查询的时候不需要通过mvcc,直接从索引找到数据位置,然后读取数据速度更快

3,mysql架构图

alt

3.1,一条sql的执行

连接器:建立连接,管理连接、校验用户身份;
查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;
解析器:解析SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;
执行 SQL:执行 SQL 共有三个阶段:

预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列
优化阶段:基于查询成本的考虑, 选择查询成本最小的执行计划;
执行阶段:根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;

4,一行记录的存储

alt

变长列表和NULL列表倒序存放
compact 紧凑排列(页溢出时存放768前缀+指针) dynamic (页溢出直接存放指针20字节) compressed(压缩整个数据页)
记录头信息:delete_mask next_record(单链表 vs 同一层页节点之间是双链表) record_type, deepseek上说是记录头在最前面

5,索引

前缀索引:对字符串的前几个字符建立索引,不需要在整个字段上建立索引,这样可以减少索引占用的存储空间
联合索引:范围查询的情况下,范围查找字段后面的字段无法用到联合索引
(a,b)这个索引,a>1 and b=2 和 a>=1 and b=2的查询方式不同,确定的查询起点可以走联合索引,在页面的索引槽中找到下一个a的起始位置,举例:查找今天已经回放的sql的分片数量。 对于 >=、<=、BETWEEN、like 前缀匹配的范围查询,并不会停止匹配

#mysql#
总结面试经验 文章被收录于专栏

1111111111

全部评论

相关推荐

没关系现在见到了、
真的很糟糕:见过国王的offer吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务