MySql
2021-03-29 10:09:29 107 举报
AI智能生成
MySQL是一个开源的关系型数据库管理系统,由瑞典的MySQL AB公司开发,现在属于Oracle公司。它使用结构化查询语言(SQL)作为访问和管理数据的主要方式。MySQL被广泛应用于各种应用中,包括网站、企业级软件、嵌入式系统等。 MySQL具有高性能、稳定性强、易于使用和扩展等优点。它支持多用户并发操作,可以处理大量的数据,并且提供了丰富的数据类型和函数,以满足不同的数据处理需求。此外,MySQL还具有良好的安全性,支持用户权限管理和数据加密等功能。 总的来说,MySQL是一个功能强大、性能优秀的数据库管理系统,是构建各种应用的理想选择。
作者其他创作
大纲/内容
存储引擎
MyISAM
三个文件,无事务行锁
InnoDB
两个文件, 有事务, 行锁
SQL语句在MySQL的执行过程
大体两部分
server
连接器
和发起请求的客户端简历连接
- 完成TCP握手
- 认证身份
- 查看权限
分析器
如果没有缓存数据, 执行分析器, 检查sql,
将sql拆分成一颗树, 可以通过antlr插件
自己测试, 分库分表场景也可以配合这个插件使用
将sql拆分成一颗树, 可以通过antlr插件
自己测试, 分库分表场景也可以配合这个插件使用
优化器
优化你的sql
- 优化联合索引
- 优化join 小表驱动大表
执行器
调用存储引擎,获取查询结果
存储引擎
Buffer Pool机制
MySql事务和锁
ACID
并发事务带来的问题
事务隔离级别
锁
性能层面
乐观锁
悲观锁
数据库层面
读锁
写锁
数据操控力度
表锁
行锁
间隙锁
临键锁
概念性:InnoDB的行锁是针对索引加的锁,不是针对记录加的锁。
并且该索引不能失效,否则都会从行锁升级为 表锁。
并且该索引不能失效,否则都会从行锁升级为 表锁。
锁优化建议
- 尽可能让所有数据检索都通过索引来完成,避免无索引行锁升级为表锁
- 合理设计索引,尽量缩小锁的范围
- 尽可能减少检索条件范围,避免间隙锁
- 尽量控制事务大小,减少锁定资源量和时间长度,涉及事务加锁的sql尽量放在事务最后执行
- 尽可能低级别事务隔离
MVCC机制
undo版本链
read-view一致性视图
版本比对规则
Buffer Pool缓存
流程图
一条修改语句在MySQL中执行, 并不是直接存放到ibd文件里去
1: 先将原始数据放置到一块缓存区域, 叫Buffer Pool
2: 将原先的值, 存放到undo日志里面去, 就是上面说的那一条undo版本链
3: 先更新内存缓存数据 Buffer Pool里的数据
4: 放入redo日志, 类似bin -log(server层的, 也就是说所有的存储引擎都有这一步)日志,写入redo日志(undo和redo是InnoDB特有的)
5: 准备提交事务-- bin-log(恢复日志)日志写入磁盘
6: 回写一个标记到redo日志里面去, 为了保证redo和bin-log数据一致性
7: IO线程随机将Buffer Pool(里面涉及LRU算法)缓存中的数据写入磁盘
1: 先将原始数据放置到一块缓存区域, 叫Buffer Pool
2: 将原先的值, 存放到undo日志里面去, 就是上面说的那一条undo版本链
3: 先更新内存缓存数据 Buffer Pool里的数据
4: 放入redo日志, 类似bin -log(server层的, 也就是说所有的存储引擎都有这一步)日志,写入redo日志(undo和redo是InnoDB特有的)
5: 准备提交事务-- bin-log(恢复日志)日志写入磁盘
6: 回写一个标记到redo日志里面去, 为了保证redo和bin-log数据一致性
7: IO线程随机将Buffer Pool(里面涉及LRU算法)缓存中的数据写入磁盘
补充:
- 日志IO 是顺序存储在磁盘
- 数据IO 是随机存储在磁盘
索引
数据结构
二叉树
红黑树
BTREE
Hash
B+TREE
磁盘
寻道(慢)
旋转(快)
索引最佳使用原则
联合索引不要建太多
全值匹配
最左前缀原则
不要在索引上进行计算
覆盖索引
Like %%
索引下推
索引优化
order by
filesort
单路排序
双路排序
group by
filesort
生成临时表
limit
select * from a where id > 9000 limit 5
根据id优化
join
用索引关联的两张表 NLJ算法
没走索引关联的两张表 BNL算法
尽量不要同时关联多张表
count
* 1 id name
工具
trace查询性能
cost 成本
能用java做的尽量用java
易扩展, 集群, 分布式
设计索引原则
先上代码, 后上索引
联合索引尽量覆盖条件
不要在数字上建立索引
很长的字符串, 可以考虑使用前缀索引
where和order by冲突时, 优先where
Explain优化工具
type
key
Extra
慢查询
可以在mysql进行配置, 一条sql超过多少秒, 就给那条sql记录到日志里
日志
bin-log
防止误操作删库
redo
配合Buffer Pool, 防止数据库临时宕机
造成的数据丢失
造成的数据丢失
undo
记录修改版本, 配合MVCC
一致性视图 read-view
0 条评论
下一页