Skip to content

Commit 691605d

Browse files
committed
modify mysql
1 parent 6b359c8 commit 691605d

16 files changed

+825
-1048
lines changed

ReadMe.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -236,19 +236,19 @@ todo
236236

237237
### MySQL
238238
* [Mysql原理与实践总结](docs/database/Mysql原理与实践总结.md)
239-
* [重新学习Mysql数据库1:无废话MySQL入门](docs/database/重新学习Mysql数据库1:无废话MySQL入门.md)
240-
* [重新学习Mysql数据库2:『浅入浅出』MySQL和InnoDB](docs/database/重新学习Mysql数据库2:『浅入浅出』MySQL和InnoDB.md)
241-
* [重新学习Mysql数据库3:Mysql存储引擎与数据存储原理](docs/database/重新学习Mysql数据库3:Mysql存储引擎与数据存储原理.md)
242-
* [重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法](docs/database/重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法.md)
243-
* [重新学习Mysql数据库5:根据MySQL索引原理进行分析与优化](docs/database/重新学习Mysql数据库5:根据MySQL索引原理进行分析与优化.md)
239+
* [重新学习Mysql数据库1:无废话MySQL入门](docs/database/重新学习MySQL数据库1:无废话MySQL入门.md)
240+
* [重新学习Mysql数据库2:『浅入浅出』MySQL和InnoDB](docs/database/重新学习MySQL数据库2:『浅入浅出』MySQL和InnoDB.md)
241+
* [重新学习Mysql数据库3:Mysql存储引擎与数据存储原理](docs/database/重新学习MySQL数据库3:Mysql存储引擎与数据存储原理.md)
242+
* [重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法](docs/database/重新学习MySQL数据库4:Mysql索引实现原理和相关数据结构算法.md)
243+
* [重新学习Mysql数据库5:根据MySQL索引原理进行分析与优化](docs/database/重新学习MySQL数据库5:根据MySQL索引原理进行分析与优化.md)
244244
* [重新学习MySQL数据库6:浅谈MySQL的中事务与锁](docs/database/重新学习MySQL数据库6:浅谈MySQL的中事务与锁.md)
245-
* [重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现](docs/database/重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现.md)
246-
* [重新学习Mysql数据库8:MySQL的事务隔离级别实战](docs/database/重新学习Mysql数据库8:MySQL的事务隔离级别实战.md)
245+
* [重新学习Mysql数据库7:详解MyIsam与InnoDB引擎的锁实现](docs/database/重新学习MySQL数据库7:详解MyIsam与InnoDB引擎的锁实现.md)
246+
* [重新学习Mysql数据库8:MySQL的事务隔离级别实战](docs/database/重新学习MySQL数据库8:MySQL的事务隔离级别实战.md)
247247
* [重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系](docs/database/重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系.md)
248248
* [重新学习MySQL数据库10:MySQL里的那些日志们](docs/database/重新学习MySQL数据库10:MySQL里的那些日志们.md)
249249
* [重新学习MySQL数据库11:以Java的视角来聊聊SQL注入](docs/database/重新学习MySQL数据库11:以Java的视角来聊聊SQL注入.md)
250250
* [重新学习MySQL数据库12:从实践sql语句优化开始](docs/database/重新学习MySQL数据库12:从实践sql语句优化开始.md)
251-
* [重新学习Mysql数据库13:Mysql主从复制,读写分离,分表分库策略与实践](docs/database/重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践.md)
251+
* [重新学习Mysql数据库13:Mysql主从复制,读写分离,分表分库策略与实践](docs/database/重新学习MySQL数据库13:Mysql主从复制,读写分离,分表分库策略与实践.md)
252252

253253

254254
## 缓存

docs/database/Mysql原理与实践总结.md

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
# Table of Contents
2-
1+
# 目录
32
* [数据库原理](#数据库原理)
43
* [范式 反范式](#范式-反范式)
54
* [主键 外键](#主键-外键)
@@ -26,16 +25,6 @@
2625
* [个人公众号:黄小斜](#个人公众号:黄小斜)
2726

2827

29-
---
30-
title: Mysql原理与实践总结
31-
date: 2018-07-08 22:15:04
32-
tags:
33-
- Mysql
34-
categories:
35-
- 后端
36-
- 技术总结
37-
---
38-
3928
本文根据自己对MySQL的学习和实践以及各类文章与书籍总结而来。
4029
囊括了MySQL数据库的基本原理和技术。本文主要是我的一个学习总结,基于之前的系列文章做了一个概括,如有错误,还望指出,谢谢。
4130

@@ -98,8 +87,7 @@ MySQL数据库的架构可以分为客户端,服务端,存储引擎和文件
9887

9988
最高层的客户端,通过tcp连接mysql的服务器,然后执行sql语句,其中涉及了查询缓存,执行计划处理和优化,接下来再到存储引擎层执行查询,底层实际上访问的是主机的文件系统。
10089

101-
![image](http://image20.it168.com/201611_670x502/2701/39b96aa41090f9bb.png)
102-
90+
![image](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/39b96aa41090f9bb.png)
10391
## mysql常用语法
10492

10593
1 登录mysql
@@ -172,14 +160,12 @@ mysql使用两个文件分别存储数据库的元数据和数据库的真正数
172160
数据页结构
173161
页是 InnoDB 存储引擎管理数据的最小磁盘单位,而 B-Tree 节点就是实际存放表中数据的页面,我们在这里将要介绍页是如何组织和存储记录的;首先,一个 InnoDB 页有以下七个部分:
174162

175-
![InnoDB-B-Tree-Node](https://raw.githubusercontent.com/Draveness/Analyze/master/contents/Database/images/mysql/InnoDB-B-Tree-Node.jpg)
176-
163+
![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405195759.png)
177164
每一个页中包含了两对 header/trailer:内部的 Page Header/Page Directory 关心的是页的状态信息,而 Fil Header/Fil Trailer 关心的是记录页的头信息。
178165

179166
也就是说,外部的h-t对用来和其他页形成联系,而内部的h-t用来是保存内部记录的状态。
180167

181-
![https://raw.githubusercontent.com/Draveness/Analyze/master/contents/Database/images/mysql/Infimum-Rows-Supremum.jpg](https://raw.githubusercontent.com/Draveness/Analyze/master/contents/Database/images/mysql/Infimum-Rows-Supremum.jpg)
182-
168+
![](https://java-tutorial.oss-cn-shanghai.aliyuncs.com/20230405195900.png)
183169
User Records 就是整个页面中真正用于存放行记录的部分,而 Free Space 就是空余空间了,它是一个链表的数据结构,为了保证插入和删除的效率,整个页面并不会按照主键顺序对所有记录进行排序,它会自动从左侧向右寻找空白节点进行插入,行记录在物理存储上并不是按照顺序的,它们之间的顺序是由 next_record 这一指针控制的。
184170

185171
也就是说,一个页中存了非常多行的数据,而每一行数据和相邻行使用指针进行链表连接。
@@ -211,13 +197,13 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行
211197
1 SIMPLE vote_record \N ALL votenum,vote \N \N \N 996507 50.00 Using where
212198

213199

214-
215-
200+
201+
216202
还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右
217203

218204

219-
220-
205+
206+
221207
最后修改一下sql语句
222208

223209
EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num > 1000;
@@ -227,25 +213,25 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行
227213
1 SIMPLE vote_record \N range PRIMARY,votenum,vote PRIMARY 4 \N 498253 50.00 Using where
228214

229215

230-
231-
216+
217+
232218
用到了索引,但是只用到了主键索引。再修改一次
233219

234220

235-
236-
221+
222+
237223
EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num = 1000;
238224

239225

240-
241-
226+
227+
242228
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
243229

244230
1 SIMPLE vote_record \N index_merge PRIMARY,votenum,vote votenum,PRIMARY 8,4 \N 51 100.00 Using intersect(votenum,PRIMARY); Using where
245231

246232

247-
248-
233+
234+
249235
用到了两个索引,votenum,PRIMARY。
250236

251237
## mysql的binlog,redo log和undo log。
@@ -334,8 +320,8 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作
334320
实现的原理是next-key lock。是gap lock的加强版。不会锁住全表,只会锁住被读取行前后的间隙行。
335321

336322

337-
338-
323+
324+
339325
## 分库分表
340326

341327
分库分表的方案比较多,首先看下分表。
@@ -350,7 +336,7 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作
350336

351337
我们需要考虑扩展性,所以需要使用分布式的数据库。
352338

353-
==分布式数据库解决方案mycat==
339+
分布式数据库解决方案mycat
354340

355341
mycat是一款支持分库分表的数据库中间件,支持单机也支持分布式。
356342

0 commit comments

Comments
 (0)