Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f88f6cc

Browse files
committed
完善翻译稿
1 parent 2b4a455 commit f88f6cc

File tree

7 files changed

+45
-14
lines changed

7 files changed

+45
-14
lines changed

‎第4部分 模式注意事项和查询优化器/Chapter13.md‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,21 @@ MySQL中的数据类型可以视为以下类别之一的一部分:
205205

206206
表 13-3 显示了 MySQL 中表示字符串和二进制数据的数据类型。该表包括可存储的最大数据量以及存储要求的说明。对于数据类型,(M) 是列必须能够存储的最大字符数,在存储的 L 字节中,是需要表示用于编码的字符集中的字符串值的字节数。
207207

208+
| 数据类型 | 存储字节 | 最大长度 |
209+
| :----------- | ------------ | -------------------------------------------- |
210+
| char(M) | M*char width | 255 chars |
211+
| varchar(M) | L+1 or L+2 | 16383 chars for utf8mb4 and 65532 for latin1 |
212+
| tinytext | L+1 | 255 bytes |
213+
| text | L+2 | 65535 bytes |
214+
| mediumtext | L+3 | 16777216 bytes |
215+
| longtext | L+4 | 4294967296 bytes |
216+
| binary(M) | M | 255 bytes |
217+
| varbinary(M) | L+1 or L+2 | 65532 bytes |
218+
| tinyblob | L+1 | 255 bytes |
219+
| blob | L+2 | 65536 bytes |
220+
| mediumblob | L+3 | 16777216 bytes |
221+
| longblob | L+4 | 4294967296 bytes |
222+
208223
字符串和二进制对象的存储要求取决于数据的长度。L 是存储值所需的字节数;对于文本字符串,还必须考虑字符集。对于可变宽度类型,使用 1~4 字节来存储值的长度。对于 char(M) 列,使用 InnoDB 存储格式的紧凑系列,以及使用可变宽度字符集对字符串进行编码时,所需的存储可能小于字符宽度的 M 倍。
209224

210225
对于所有字符和 varchar,字符串的最大支持长度以字节为单位指定。这意味着可以存储的字符串类型的字符数取决于字符集。此外,字符、varchar、二进制列和二进制列都计入行宽度,其总宽度必须小于 64 kiB,这意味着实际上很少能够使用理论最大长度创建列。(这也是 varchar 和 varbinary 列在最多可以存储 65532 个字符/字节的原因。对于长文本列和长文本列,应该指出,虽然它们原则上可以存储多达 4 GiB 的数据,但在实践中,存储受 max_allowed_packet 变量限制,最多只能存储 1 GiB。

‎第4部分 模式注意事项和查询优化器/Chapter14.md‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ ALTER TABLE db1.person DROP INDEX name_2;
267267

268268
生活中很少有东西是免费的——索引也不例外。虽然索引非常适合提高查询性能,但还需要存储和保持最新。此外,执行查询时不太明显的开销,索引越多,优化器需要做的工作也越多。本节将介绍索引的这三个缺点。
269269

270-
### Storage
270+
### 存储
271271

272272
添加索引最明显的成本之一是需要存储索引,因此需要时随时可用。您不希望每次需要时首先创建索引,因为这将扼杀索引的性能优势。
273273

@@ -520,7 +520,6 @@ VIRTUAL,
520520
PRIMARY KEY (`_id`)
521521
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
522522
1 row in set (0.0006 sec)
523-
524523
```
525524

526525
UPDATE 语句使用 JSON_ARRAYAGG() 函数创建一个 JSON 数组,其中包含三个 JSON 对象(地区、名称和人口)。最后,执行 SELECT 语句以返回澳大利亚城市的名称。

‎第4部分 模式注意事项和查询优化器/Chapter15.md‎

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@
44

55
本章首先讨论了什么是索引统计信息以及 InnoDB 如何处理索引统计信息。然后,您将了解瞬态和持久性统计信息。本章的其余部分介绍如何监视统计信息并更新统计信息。
66

7-
## What Are Index Statistics?
7+
## 什么是索引统计?
88

99
当 MySQL 决定是否使用索引时,归结起来就是 MySQL 认为索引对查询的成效如何。请记住,当您使用辅助索引时,实际上将有一个额外的主键查找来访问数据。辅助索引的排序方式与行的方式不一样,因此使用索引通常意味着随机 I/O(这可以帮助使用覆盖索引)。另一方面,表扫描是更大的顺序 I/O。因此,行对行,执行表扫描比使用辅助索引查找同一行便宜。
1010

1111
这意味着,索引要有效,必须筛选出表的很大一部分。必须筛选出多少取决于硬件的性能特征、缓冲池中的表数量、表定义等。在旧旋转磁盘时代,经验法则是,如果需要超过 30% 的行,则首选表扫描。内存中的行数越高,磁盘的随机 I/O 性能越好,此阈值越高。
1212

13-
**注意 覆盖索引会更改此图片,因为它们减少了从跳到实际行数据所需的随机 I/O 量。**
13+
------
14+
15+
**注意** 覆盖索引会更改此图片,因为它们减少了从跳到实际行数据所需的随机 I/O 量。
16+
17+
------
1418

1519
这就是索引统计信息的图。优化器(是决定使用哪个查询计划的 MySQL 部分)需要一些简单的方法来确定索引对于给定查询计划的作用。优化器显然知道索引包括哪些列,但此外,它需要一些度量索引筛选行的程度。此信息是索引统计信息提供的信息。因此,索引统计是衡量索引选择性的指标。有两个主要统计信息:唯一值的数量和一定范围内的值数。
1620

@@ -49,12 +53,20 @@ InnoDB 通过分析索引的随机叶页来计算其索引统计信息。例如
4953

5054
将示例页数设置为给定值是什么意思?这取决于索引中的列数。如果只有一列,则该值实际上意味着对叶页数进行采样。但是,对于多列索引,页数是每列。例如,如果将示例页数设置为 20,并且索引中包含四列,则总共采样 4*20=80 页。
5155

56+
------
57+
5258
**注意 在实践中,索引统计信息采样比本章中描述的要复杂得多。例如,并不总是需要一直下降到叶页。考虑两个相邻的非叶节点何时具有相同的值。然后可以得出结论,最左侧(根据顺序)零件的所有叶页具有相同的值。如果您有兴趣了解更多,一个好的起点是源代码中存储/innobase/dict/dict0stats.cc 文件顶部的注释:https://github.com/mysql/mysql-server/blob/8.0/ 存储/innobase/dict/dict0stats.cc。**
5359

60+
------
61+
5462
必须检查多少页才能得到良好的估计?这取决于表。如果数据是统一的,也就是说,每个索引值的行数大致相同,则只需要检查相对较少的页数,并且默认的页数通常就足够了。另一方面,如果您的数据分布非常不规则,则可能需要增加采样页数。非常不规则的数据示例是队列中任务的状态。随着时间的推移,大多数任务将状态为已完成。在最坏的情况下,您可能会体验到所有随机潜水都看到相同的状态,使 InnoDB 得出结论,只有一个值,并且索引作为筛选器毫无价值。
5563

64+
------
65+
5666
**提示 对于只有几行且值用于筛选的数据,下一章中讨论的直方图对于改进查询计划非常有用。**
5767

68+
------
69+
5870
表大小也是需要考虑的一个因素。表格越大,一般必须检查的页面越大,才能得到良好的估计。原因是表越大,整个叶页就越有可能指向索引值相同的行。这会降低每个采样页的值,因此为了进行补偿,需要采样更多页面。
5971

6072
特殊情况是,InnoDB 已配置为进行比叶页更多的索引潜水。在这种情况下,InnoDB 将检查所有叶页,并在该点停止。这将提供尽可能准确的统计数据。如果在分析期间没有活动事务,则该时间点的统计数据将精确。这包括表中的页数。在本章的稍后部分,您将学习如何在索引和表中查找表的叶页数
@@ -91,8 +103,6 @@ ALTER TABLE world.city
91103

92104

93105

94-
95-
96106
## Persistent Index Statistics
97107

98108
MySQL 5.6 中引入了持久索引统计信息,以使查询计划比较旧的瞬态索引统计信息更稳定。如名称建议,启用持久索引统计信息后,将保存统计信息,以便当 MySQL 重新启动时不会丢失统计信息。与单单坚持性更多的差异,尽管将变得清晰。
@@ -119,8 +129,12 @@ MySQL 5.6 中引入了持久索引统计信息,以使查询计划比较旧的
119129

120130
请记住,索引统计信息是使用读取未提交的事务隔离级别计算的。虽然在大多数情况下,这是提供最佳统计信息的,但有一个例外。当事务暂时完全更改数据的分布时,可能会导致不正确的统计信息。对表进行完全重建是最极端的情况,也是人们最经常看到的问题。就是在引入这样的innodb_stats_ include_delete_marked选择。InnoDB 仍将将它们包括在统计信息中,而不是将未提交的已删除行视为已删除。该选项仅作为全局选项存在,因此,即使您只有一个表存在此问题,它也会影响所有表。如前所述,另一种选择是禁用受影响表的统计信息自动重新计算,并自己处理。
121131

132+
------
133+
122134
**提示 如果事务对表进行了大的更改(如删除所有行,然后重新生成表),请考虑禁用表的索引统计信息自动重新计算或启用innodb_stats_include_delete_marked。**
123135

136+
------
137+
124138
迄今为止,只提到全球选择。如何更改表的索引统计信息设置?由于可以使用 STATS_PERSISTENT 表选项覆盖表的 innodb_stats_persistent 的全局值,因此有一些选项来控制表的持久统计信息的行为方式。表选项是
125139

126140
- **STATS_AUTO_RECALC**:覆盖是否
@@ -129,7 +143,7 @@ MySQL 5.6 中引入了持久索引统计信息,以使查询计划比较旧的
129143

130144
可以使用创建表时设置这些选项,也可以在以后使用 ALTER 表设置这些选项,如清单 15-1 所示。
131145

132-
```
146+
```sql
133147
Listing 15-1. Setting the persistent statistics options for a table
134148
mysql> CREATE SCHEMA IF NOT EXISTS chapter_15;
135149
Query OK, 1 row affected (0.4209 sec)
@@ -153,7 +167,6 @@ mysql> ALTER TABLE city
153167
STATS_SAMPLE_PAGES = 20;
154168
Query OK, 0 rows affected (0.0280 sec)
155169
Records: 0 Duplicates: 0 Warnings: 0
156-
157170
```
158171

159172
首先,创建表城市时禁用自动重新计算并创建 10 个示例页。然后更改设置以启用自动重新计算,并增加示例页数至 20。请注意 ALTER 表如何返回受影响的 0 行。更改持久统计选项只会更改表的元数据,因此它们会立即发生,并且不会影响数据。这意味着您可以根据需要更改设置,而不必担心执行昂贵的操作。例如,您可能希望在批量操作期间禁用自动重新计算。
@@ -259,8 +272,12 @@ sum_of_other_index_sizes: 8
259272
1 row in set (0.0005 sec)
260273
```
261274

275+
------
276+
262277
**提示 innodb_index_stats 和innodb_table_stats是常规表。在备份中包含表非常有用,因此如果查询计划突然更改,可以返回并比较统计信息。还可以为具有 UPDATE 权限的用户更新表。这似乎是一个非常有用的属性,但要小心。如果不知道正确的统计信息,您最终会有非常差的查询计划。手动修改索引统计信息几乎不应完成。如果完成,则更改仅在刷新表后生效。**
263278

279+
------
280+
264281
如果您觉得innodb_index_ 统计数据和 innodb_table_stats 中有关信息的讨论与 SHOW INDEX 语句以及表和统计信息架构表中可能用于查看的信息类似,那么您就是对的。有一些重叠。由于这些来源也适用于瞬态统计,因此将推迟到讨论瞬态索引统计之后。
265282

266283
## Transient Index Statistics

‎第4部分 模式注意事项和查询优化器/Chapter16.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
本章开始讨论什么是直方图,以及哪些工作负载直方图很有用。然后介绍使用直方图的更实际的一面,包括添加、维护和检查直方图数据。最后,还有一个查询示例,其中查询计划随着直方图的添加而更改。
66

7-
## What Are Histograms?
7+
## 什么是直方图?
88

99
对直方图的支持是 MySQL 8 中的新功能。它使分析和存储有关数据在表中分布的信息成为可能。虽然直方图与索引有些相似,但它们并不相同,并且您可以为没有任何索引的列具有直方图。
1010

‎第4部分 模式注意事项和查询优化器/Chapter18.md‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313

1414

15-
## Why Are Locks Needed?
15+
## 为什么需要锁?
1616

1717
这似乎是一个完美的世界,不需要锁定数据库。但是,价格会如此之高,以使得只有很少的用例可以使用该数据库,而且对于通用数据库(如 MySQL)来说,这是不可能的。如果没有锁定,则不能具有任何并发性。假设只有一个连接被允许到数据库(你可以争辩说,它本身就是一个锁,因此系统不是无锁的) - 这不是非常有用的大多数应用程序。
1818

@@ -26,15 +26,15 @@
2626

2727
由于控制交叉路口的控制级别不同(屈服,停车标志和交通信号灯),数据库中的锁类型也不同。
2828

29-
## Lock Access Levels
29+
## 锁访问级别
3030

3131
锁访问级别确定给定锁允许的访问类型。它有时也称为锁类型,但由于这与锁粒度混淆,因此此处使用术语锁访问级别。
3232

3333
基本上有两个访问级别:共享或独占。访问级别根据他们的名字建议进行。共享锁允许其他连接也获取共享锁。这是最宽松的锁访问级别。独占锁只允许该一个连接获取锁。共享锁也称为读取锁,独占锁也称为写入锁。
3434

3535
MySQL 还有一个称为意向锁的概念,它指定了交易的意图。意向锁可以是共享的,也可以是独占的。当下一节将介绍隐式表锁,通过 MySQL 中的主要锁粒度级别时,将更详细地讨论意向锁。
3636

37-
## Lock Granularity
37+
## 锁粒度
3838

3939
MySQL 使用一系列不同的锁粒度(也称为锁类型)来控制对数据的访问。通过使用不同的锁粒度,可以尽可能允许并发访问数据。本节将介绍 MySQL 使用的主要粒度级别。
4040

‎第6部分 改善查询/Chapter25.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
不时地执行架构更改或将大量数据导入表中。这可能是为了适应新功能、还原备份、导入由第三方进程生成的数据或类似功能。虽然原始磁盘写入性能自然非常重要,但您也可以在 MySQL 端执行几项操作来提高这些操作的性能。
44

5-
本章开始讨论架构更改,然后继续讨论有关加载数据的一些一般注意事项。当您一次插入单行时,这些注意事项也适用。本章的其余部分介绍如何通过按主键顺序插入来提高数据加载性能,缓冲池和辅助索引如何影响性能、配置和调整语句本身。最后,演示了 MySQL 外壳的并行导入功能
5+
本章开始讨论架构更改,然后继续讨论有关加载数据的一些一般注意事项。当您一次插入单行时,这些注意事项也适用。本章的其余部分介绍如何通过按主键顺序插入来提高数据加载性能,缓冲池和辅助索引如何影响性能、配置和调整语句本身。最后,演示了 MySQL Shell的并行导入功能
66

77
## 架构更改
88

‎第6部分 改善查询/Chapter27.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
最便宜的查询是您根本不执行的查询。 本章研究如何使用缓存来避免执行查询或降低查询的复杂性。 首先,将讨论缓存如何到处存在以及如何有不同类型的缓存。 然后介绍了如何使用缓存表和近似值在MySQL内部使用缓存。 接下来的两个部分将介绍提供缓存的两种流行产品:Memcached和ProxySQL。 最后,讨论了一些缓存技巧。
44

5-
## Caching Is Everywhere
5+
## 缓存无处不在
66

77
即使您认为没有实现缓存,也已经在多个地方使用了缓存。 这些缓存是透明的,并在硬件,操作系统或MySQL级别进行维护。 这些缓存中最明显的是InnoDB缓冲池。
88

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /