《MySql基础》读书笔记
2022-05-17 14:47:46 0 举报
使用 (¥20)
AI智能生成
MySql基础实战之路
作者其他创作
大纲/内容
SQL语句在MySQL的执行过程
大体两部分
server
连接器<br>
<font color="#31a8e0">和发起请求的客户端简历连接<br><ol><li><span style="color: rgb(49, 168, 224);">完成TCP握手</span></li><li>认证身份<br></li><li>查看权限</li></ol></font>
分析器
如果没有缓存数据, 执行分析器, 检查sql, <br>将sql拆分成<font color="#c41230">一颗树, 可以通过antlr插件</font><br>自己测试, 分库分表场景也可以配合这个插件使用<br>
优化器
<font color="#31a8e0">优化你的sql<br></font><ol><li><font color="#31a8e0">优化联合索引</font></li><li><font color="#31a8e0">优化join 小表驱动大表</font></li></ol><br>
执行器
调用存储引擎,获取查询结果
存储引擎
Buffer Pool机制
MySql事务和锁
ACID
并发事务带来的问题<br>
<span style="font-size: inherit;">事务隔离级别</span><br>
锁
性能层面
乐观锁
悲观锁
数据库层面<br>
读锁
写锁
数据操控力度
表锁
行锁
间隙锁<br>
临键锁<br>
概念性:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。<br>并且该索引不能失效,否则都会从行锁升级为 表锁。<br>
锁优化建议
<ol><li>尽可能让所有数据检索都通过索引来完成,<br>避免无索引行锁升级为表锁 </li><li> 合理设计索引,尽量缩小锁的范围 </li><li> 尽可能减少检索条件范围,避免间隙锁 </li><li> 尽量控制事务大小,减少锁定资源量和时间长度,<br>涉及事务加锁的sql尽量放在事务最后执行 </li><li> 尽可能低级别事务隔离 </li></ol>
MVCC机制
undo版本链<br>
read-view一致性视图
版本比对规则
Buffer Pool缓存
流程图
一条修改语句在MySQL中执行, 并不是直接存放到ibd文件里去<br> 1: 先将原始数据放置到一块缓存区域, 叫Buffer Pool<br> 2: 将原先的值, 存放到undo日志里面去, 就是上面说的那一条undo版本链<br> 3: 先更新内存缓存数据 Buffer Pool里的数据<br> 4: 放入redo日志, 类似bin -log(server层的, 也就是说所有的存储引擎都有这一步)日志,写入redo日志(undo和redo是InnoDB特有的)<br> 5: 准备提交事务-- bin-log(恢复日志)日志写入磁盘<br> 6: 回写一个标记到redo日志里面去, 为了保证redo和bin-log数据一致性<br> 7: IO线程随机将Buffer Pool(里面涉及LRU算法)缓存中的数据写入磁盘
补充: <br><ol><li>日志IO 是顺序存储在磁盘<br></li><li>数据IO 是随机存储在磁盘</li></ol>
索引<br>
数据结构
二叉树
红黑树
BTREE
<span style="font-size: inherit;"><font color="#c41230">Hash</font></span><br>
<font color="#c41230">B+TREE</font>
磁盘
寻道(慢)
旋转(快)
索引最佳使用原则
联合索引不要建太多<br>
全值匹配
<font color="#c41230">最左前缀原则</font><br>
不要在索引上进行计算<br>
覆盖索引<br>
Like %%
<font color="#c41230">索引下推</font>
索引优化
order by<br>
filesort
<font color="#c41230">单路排序</font>
<font color="#c41230">双路排序</font>
group by
filesort
生成临时表
limit
select * from a where id > 9000 limit 5<br>
根据id优化
join
用索引关联的两张表 <font color="#c41230">NLJ算法</font><br>
没走索引关联的两张表 <font color="#c41230">BNL算法</font><br>
尽量不要同时关联多张表
count
* 1 id name<br>
工具
trace查询性能<br>
cost 成本
能用java做的尽量用java<br>
易扩展, 集群, 分布式
设计索引原则
先上代码, 后上索引<br>
联合索引尽量覆盖条件<br>
不要在数字上建立索引<br>
很长的字符串, 可以考虑使用前缀索引
where和order by冲突时, 优先where
Explain优化工具<br>
type<br>
key
Extra<br>
慢查询
可以在mysql进行配置, 一条sql超过多少秒, 就给那条sql记录到日志里<br>
日志
bin-log
防止误操作删库
redo
配合Buffer Pool, 防止数据库临时宕机<br>造成的数据丢失
undo
记录修改版本, 配合MVCC
一致性视图 read-view
存储引擎
MyISAM
三个文件,无事务行锁
InnoDB
两个文件, 有事务, 行锁
0 条评论
下一页