Skip to content

Commit 4f83211

Browse files
committed
auto commit
1 parent a9372a5 commit 4f83211

File tree

2 files changed

+13
-18
lines changed

2 files changed

+13
-18
lines changed

.gitignore

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
*.txt
2-
.idea/

notes/MySQL.md

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
* [水平切分](#水平切分)
2222
* [垂直切分](#垂直切分)
2323
* [Sharding 策略](#sharding-策略)
24-
* [Sharding 存在的问题](#sharding-存在的问题)
24+
* [Sharding 存在的问题及解决方案](#sharding-存在的问题及解决方案)
2525
* [六、复制](#六复制)
2626
* [主从复制](#主从复制)
2727
* [读写分离](#读写分离)
@@ -197,9 +197,6 @@ InnoDB 的 B+Tree 索引分为主索引和辅助索引。
197197

198198
<div align="center"> <img src="../pics//7ab8ca28-2a41-4adf-9502-cc0a21e63b51.jpg"/> </div><br>
199199

200-
201-
202-
203200
### 2. 哈希索引
204201

205202
InnoDB 引擎有一个特殊的功能叫“自适应哈希索引”,当某个索引值被使用的非常频繁时,会在 B+Tree 索引之上再创建一个哈希索引,这样就让 B+Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。
@@ -283,11 +280,11 @@ customer_id_selectivity: 0.0373
283280

284281
索引包含所有需要查询的字段的值。
285282

286-
具有以下优点优点
283+
具有以下优点
287284

288285
- 因为索引条目通常远小于数据行的大小,所以若只读取索引,能大大减少数据访问量。
289286
- 一些存储引擎(例如 MyISAM)在内存中只缓存索引,而数据依赖于操作系统来缓存。因此,只访问索引可以不使用系统调用(通常比较费时)。
290-
- 对于 InnoDB 引擎,若二级索引能够覆盖查询,则无需访问聚簇索引
287+
- 对于 InnoDB 引擎,若辅助索引能够覆盖查询,则无需访问主索引
291288

292289
# 四、查询性能优化
293290

@@ -346,10 +343,10 @@ do {
346343
将一个大连接查询(JOIN)分解成对每一个表进行一次单表查询,然后将结果在应用程序中进行关联,这样做的好处有:
347344

348345
- 让缓存更高效。对于连接查询,如果其中一个表发生变化,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变化,对其它表的查询缓存依然可以使用。
346+
- 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余记录的查询。
349347
- 减少锁竞争;
350348
- 在应用层进行连接,可以更容易对数据库进行拆分,从而更容易做到高性能和可扩展。
351349
- 查询本身效率也可能会有所提升。例如下面的例子中,使用 IN() 代替连接查询,可以让 MySQL 按照 ID 顺序进行查询,这可能比随机的连接要更高效。
352-
- 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余记录的查询。
353350

354351
```sql
355352
SELECT * FROM tab
@@ -370,33 +367,33 @@ SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
370367

371368
<div align="center"> <img src="../pics//63c2909f-0c5f-496f-9fe5-ee9176b31aba.jpg"/> </div><br>
372369

373-
水平切分就是就是常见的 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中。
370+
水平切分又称为 Sharding,它是将同一个表中的记录拆分到多个结构相同的表中。
374371

375372
当一个表的数据不断增多时,Sharding 是必然的选择,它可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力。
376373

377374
## 垂直切分
378375

379376
<div align="center"> <img src="../pics//e130e5b8-b19a-4f1e-b860-223040525cf6.jpg"/> </div><br>
380377

381-
垂直切分是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。
378+
垂直切分是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分也可以利用垂直切分将经常被使用的列和不经常被使用的列切分到不同的表中。
382379

383-
也可以在数据库的层面使用垂直切分,它按数据库中表的密集程度部署到不同的库中,例如将原来的电商数据库垂直切分成商品数据库 payDB、用户数据库 userBD 等。
380+
在数据库的层面使用垂直切分将按数据库中表的密集程度部署到不同的库中,例如将原来的电商数据库垂直切分成商品数据库 payDB、用户数据库 userBD 等。
384381

385382
## Sharding 策略
386383

387384
- 哈希取模:hash(key) % NUM_DB
388385
- 范围:可以是 ID 范围也可以是时间范围
389386
- 映射表:使用单独的一个数据库来存储映射关系
390387

391-
## Sharding 存在的问题
388+
## Sharding 存在的问题及解决方案
392389

393390
### 1. 事务问题
394391

395-
使用分布式事务,比如 XA 接口。
392+
使用分布式事务来解决,比如 XA 接口。
396393

397394
### 2. JOIN
398395

399-
将原来的 JOIN 查询分解成多个单表查询,然后在用户程序中进行 JOIN。
396+
可以将原来的 JOIN 查询分解成多个单表查询,然后在用户程序中进行 JOIN。
400397

401398
### 3. ID 唯一性
402399

@@ -416,21 +413,21 @@ SELECT * FROM post WHERE post.id IN (123,456,567,9098,8904);
416413
主要涉及三个线程:binlog 线程、I/O 线程和 SQL 线程。
417414

418415
- **binlog 线程** :负责将主服务器上的数据更改写入二进制文件(binlog)中。
419-
- **I/O 线程** :负责从主服务器上读取二进制日志文件,并写入中继日志中
416+
- **I/O 线程** :负责从主服务器上读取二进制日志文件,并写入从服务器的中继日志中
420417
- **SQL 线程** :负责读取中继日志并重放其中的 SQL 语句。
421418

422419
<div align="center"> <img src="../pics//master-slave.png"/> </div><br>
423420

424421
## 读写分离
425422

426-
主服务器用来处理写操作,而从服务器用来处理读操作。
423+
主服务器用来处理写操作以及实时性要求比较高的读操作,而从服务器用来处理读操作。
427424

428425
读写分离常用代理方式来实现,代理服务器接收应用层传来的读写请求,然后决定转发到哪个服务器。
429426

430427
MySQL 读写分离能提高性能的原因在于:
431428

432429
- 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
433-
- 从服务器可以配置 MyISAM 引擎,提升查询技能以及节约系统开销
430+
- 从服务器可以配置 MyISAM 引擎,提升查询性能以及节约系统开销
434431
- 增加冗余,提高可用性。
435432

436433
<div align="center"> <img src="../pics//master-slave-proxy.png"/> </div><br>

0 commit comments

Comments
 (0)