-
Notifications
You must be signed in to change notification settings - Fork 0
/
mysqlji-zhu-nei-mu-innodbcun-chu-yin-qing-du-shu-bi-ji.html
436 lines (396 loc) · 19.3 KB
/
mysqlji-zhu-nei-mu-innodbcun-chu-yin-qing-du-shu-bi-ji.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="CatsAction" />
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary">
<meta name="keywords" content="DB, SQL, MySQL, 读书笔记, " />
<meta property="og:title" content="《MySQL技术内幕:InnoDB存储引擎》读书笔记"/>
<meta property="og:url" content="./mysqlji-zhu-nei-mu-innodbcun-chu-yin-qing-du-shu-bi-ji.html" />
<meta property="og:description" content="第一章:MySQL体系结构和存储引擎 1,MySQL组成 连接池组件 管理服务和工具组件 SQL接口组件 查询分析组件 优化器组件 缓冲组件 插件式存储引擎 存储文件 2,MySQL存储引擎 InnoDB MyISAM NDB Memory Archive Federated Maria 第二章:InnoDB存储引擎 1,InnoDB体系结构 1),后台线程 默认情况下,InnoDB有七个后台线程。1个master thread,4个IO thread,1个锁线程,1个监控线程。 4个IO thread分别是insert buffer thread,log thread,read thread,write thread。 2),内存 InnoDB存储引擎内存由以下几部分组成 缓冲池(buffer …" />
<meta property="og:site_name" content="CatsAction's blog" />
<meta property="og:article:author" content="CatsAction" />
<meta property="og:article:published_time" content="2018-10-10T00:00:00+08:00" />
<meta name="twitter:title" content="《MySQL技术内幕:InnoDB存储引擎》读书笔记">
<meta name="twitter:description" content="第一章:MySQL体系结构和存储引擎 1,MySQL组成 连接池组件 管理服务和工具组件 SQL接口组件 查询分析组件 优化器组件 缓冲组件 插件式存储引擎 存储文件 2,MySQL存储引擎 InnoDB MyISAM NDB Memory Archive Federated Maria 第二章:InnoDB存储引擎 1,InnoDB体系结构 1),后台线程 默认情况下,InnoDB有七个后台线程。1个master thread,4个IO thread,1个锁线程,1个监控线程。 4个IO thread分别是insert buffer thread,log thread,read thread,write thread。 2),内存 InnoDB存储引擎内存由以下几部分组成 缓冲池(buffer …">
<title>《MySQL技术内幕:InnoDB存储引擎》读书笔记 ·
CatsAction's blog
</title>
<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="./theme/image/logo.ico" />
<link rel="stylesheet" type="text/css" href="./theme/css/elegant.prod.css" media="screen">
<link rel="stylesheet" type="text/css" href="./theme/css/custom.css" media="screen">
</head>
<body>
<div id="content">
<div class="navbar navbar-static-top">
<div class="navbar-inner">
<div class="container-fluid">
<a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
<a class="brand" href="./"><span class=site-name>CatsAction's blog</span></a>
<div class="nav-collapse collapse">
<ul class="nav pull-right top-menu">
<li >
<a href=
.
>Home</a>
</li>
<li ><a href="./categories.html">Categories</a></li>
<li ><a href="./tags.html">Tags</a></li>
<li ><a href="./archives.html">Archives</a></li>
<li><form class="navbar-search" action="./search.html" onsubmit="return validateForm(this.elements['q'].value);"> <input type="text" class="search-query" placeholder="Search" name="q" id="tipue_search_input"></form></li>
</ul>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row-fluid">
<div class="span1"></div>
<div class="span10">
<article itemscope>
<div class="row-fluid">
<header class="page-header span10 offset2">
<h1>
<a href="./mysqlji-zhu-nei-mu-innodbcun-chu-yin-qing-du-shu-bi-ji.html">
《MySQL技术内幕:InnoDB存储引擎》读书笔记
</a>
</h1>
</header>
</div>
<div class="row-fluid">
<div class="span8 offset2 article-content">
<h2>第一章:MySQL体系结构和存储引擎</h2>
<h5>1,MySQL组成</h5>
<ul>
<li>连接池组件</li>
<li>管理服务和工具组件</li>
<li>SQL接口组件</li>
<li>查询分析组件</li>
<li>优化器组件</li>
<li>缓冲组件</li>
<li>插件式存储引擎</li>
<li>存储文件</li>
</ul>
<h5>2,MySQL存储引擎</h5>
<ul>
<li>InnoDB</li>
<li>MyISAM</li>
<li>NDB</li>
<li>Memory</li>
<li>Archive</li>
<li>Federated</li>
<li>Maria</li>
</ul>
<h2>第二章:InnoDB存储引擎</h2>
<h5>1,InnoDB体系结构</h5>
<p>1),后台线程</p>
<p>默认情况下,InnoDB有七个后台线程。1个master thread,4个IO thread,1个锁线程,1个监控线程。</p>
<p>4个IO thread分别是insert buffer thread,log thread,read thread,write thread。</p>
<p>2),内存</p>
<p>InnoDB存储引擎内存由以下几部分组成</p>
<ul>
<li>缓冲池(buffer pool)</li>
<li>重做日志缓冲池(redo log pool)</li>
<li>额外内存吃(additional memory pool)</li>
</ul>
<p>buffer pool:</p>
<p>buffer pool占内存最大块,用来存放各种数据的缓存(按每页16K操作)。</p>
<p>buffer pool数据页类型有如下几种,其中data page和index page占很大一部分。</p>
<ul>
<li>data page(数据页)</li>
<li>index page(索引页)</li>
<li>insert buffer(插入缓冲)</li>
<li>adaptive hash index(自适应哈希索引)</li>
<li>lock info(InnoDB存储的锁信息)</li>
<li>data dictionary(数据字典信息)</li>
</ul>
<h5>2,master thread</h5>
<p>InnoDB主要工作由master thread完成,master thread有以下几个loop(循环)组成。master thread会根据数据库运行
情况在几个循环之间切换。</p>
<ul>
<li>main loop(主循环)</li>
<li>background loop(后台循环)</li>
<li>flush loop(刷新循环)</li>
<li>suspend loop(暂停循环)</li>
</ul>
<p>master thread潜在问题:</p>
<p>InnoDB对IO有限制,在硬盘性能飞速发展的今天,不能很好的利用硬盘性能。最新的版本中增加了几个对master thread的可配置参数。</p>
<h5>3,关键特性</h5>
<ul>
<li>插入缓冲(针对非聚集索引插入的优化)</li>
<li>两次写</li>
<li>自适应哈希索引</li>
</ul>
<h2>第三章:文件</h2>
<h5>1,表结构定义文件</h5>
<p>MySQL自身的文件,以frm后缀结尾,每个表都拥有单独的表结构定义文件。</p>
<h5>2,InnoDB存储引擎文件</h5>
<p>1),表空间文件</p>
<p>可以所有表放到一个表空间文件里,也可以通过参数配置一个表一个表空间文件。默认的表空间文件是多个表共用的ibdata1文件。</p>
<p>2),重做日志文件</p>
<ul>
<li>ib_logfile0</li>
<li>ib_logfile1</li>
</ul>
<h2>第四章:表</h2>
<p>InnoDB的表是索引组织的,聚簇索引的叶子节点存储的即为行记录(数据)。</p>
<h5>1,InnoDB逻辑存储结构</h5>
<p>从InnoDB逻辑上看,所有数据都被存储在一个空间中(表空间)。表空间由以下几部分组成,其中上面的层包含下面层。</p>
<ul>
<li>段(segment)</li>
<li>区(extent),默认大小为1M,即64页。</li>
<li>页(page),默认每页大小为16k。</li>
<li>行(row)</li>
</ul>
<h5>2,InnoDB行记录格式</h5>
<ul>
<li>Compact(默认)</li>
<li>Redundant(为兼容之前版本保留)</li>
</ul>
<p>1),Compact格式</p>
<p>| 变长字段长度列表 | NULL标志位 | 记录头信息 | 列1数据 | 列2数据 | ...... |</p>
<p>2),Redundant格式</p>
<p>| 字段长度偏移列表 | 记录台信息 | 列1数据 | 列2数据 | ...... |</p>
<h5>3,InnoDB数据页结构</h5>
<ul>
<li>File Header(文件头)</li>
<li>Page Header(页头)</li>
<li>Infimun和Supremum Records</li>
<li>User Records</li>
<li>Free Space</li>
<li>Page Directory</li>
<li>File Trailer</li>
</ul>
<h5>4,分区表</h5>
<p>分区功能不是在存储引擎功能完成的。MySQL支持水平分区(按行分区),而不支持垂直分区(按列分区)。
MySQL支持的分区为局部分区(一个分区即存放了数据,又存放了索引),而不支持全局分区(数据存放在各个分区中,但索引全部存放在一个对象中)。</p>
<p>MySQL数据库支持以下几种类型的分区:</p>
<ul>
<li>Range分区:根据分区列连续区间分区。</li>
<li>List分区:相对于Range分区,List分区是离散的。</li>
<li>Hash分区:根据用户自定义表达式的返回值来分区。</li>
<li>Key分区:根据MySQL数据库提供的哈希函数来分区。</li>
</ul>
<h2>第五章:索引和算法</h2>
<h5>1,InnoDB支持的索引类型</h5>
<ul>
<li>B+树索引</li>
<li>Hash索引</li>
<li>全文索引</li>
</ul>
<p>关于B树和B+树的详细讲解,可以查看<a href="https://www.cnblogs.com/nullzx/p/8729425.html">B+树</a></p>
<h5>2,B+树索引类型</h5>
<p>1),聚集索引</p>
<p>叶子节点存储了整行的记录数据。通常一个表的聚簇索引就是主键索引。一个表只能有一个聚簇索引。</p>
<p>2),辅助索引(普通索引)</p>
<p>叶子节点存储键和行记录的主键,因此查询数据可能产生回表,可以通过索引覆盖解决。</p>
<p>关于聚簇索引和索引覆盖,查看我的另一篇博客<a href="./mysqlxi-lie-san.html">聚簇索引</a></p>
<p>3)索引管理</p>
<ul>
<li>创建索引:create index</li>
<li>删除索引: drop index</li>
<li>查看索引信息: show index from table</li>
</ul>
<p>4)一些索引信息</p>
<ul>
<li>联合索引</li>
<li>索引覆盖</li>
<li>优化器(未索引覆盖的情况下,优化器可能选择走聚簇索引)</li>
</ul>
<h2>第六章:锁</h2>
<p>锁是数据库区别于文件系统的一个关键特性。锁用于管理共享资源的并发访问。不同的数据库和存储引擎有不同的锁实现机制。</p>
<h5>1,锁的类型</h5>
<ul>
<li>共享锁</li>
<li>排它锁</li>
</ul>
<h5>2,锁的机制</h5>
<h5>3,锁的算法</h5>
<ul>
<li>Record Lock:单个行记录上锁</li>
<li>Gap Lock:间隙锁,锁定一个范围,但不包括行记录本身</li>
<li>Next-Key Lock:上两种锁的结合</li>
</ul>
<h5>4,锁问题</h5>
<ul>
<li>脏读:可以读取到脏数据(一个事物可以读取到另一个事务未提交的数据)</li>
<li>丢失更新:一个事务在另一个事务在读取的过程中做了修改,导致两次读取的数据集不一致</li>
<li>不可重复度:一个事务的更新操作会被另一个事务的更新操作所覆盖(数据库锁并不会有这个问题,但是用户层面可能产生这个问题)</li>
</ul>
<h5>5,死锁</h5>
<p>死锁是两个以上的事务在执行过程中,因争夺资源而造成互相等待的现象。</p>
<p>解决方法:</p>
<ul>
<li>超时回滚重做</li>
<li>wait-for Graph(等待图)</li>
</ul>
<h2>第七章:事务</h2>
<h5>1,事务特性</h5>
<ul>
<li>原子性(atomicity)</li>
<li>一致性(consistency)</li>
<li>隔离性(isolation)</li>
<li>持久性(durability)</li>
</ul>
<h5>2,事务隔离级别</h5>
<ul>
<li>READ UNCOMMITTED</li>
<li>READ COMMITTED</li>
<li>REPEATABLE READ</li>
<li>SERIALIZABLE</li>
</ul>
<h5>3,分布式锁</h5>
<p>分布式事务指的是允许多个独立的事务资源参与到一个全局的事务中。全局事务要求在其中的所有参与的事务,要么都提交,要么都回滚。分布式事务允许不同数据库之间的分布式事务,常见于银行系统的转账业务。</p>
<h2>第八章:备份与恢复</h2>
<ul>
<li>热备</li>
<li>冷备</li>
<li>温呗</li>
</ul>
<h5>1,冷备</h5>
<p>对于InnoDB,需要备份表结构frm文件,共享表空间文件,独立表空间文件.ibd,重做日志。</p>
<h5>2,热备</h5>
<ul>
<li>ibbackup</li>
<li>XtraBackup</li>
</ul>
<h5>3,快照备份</h5>
<p>MySQL本身不支持快照备份,但是可以基于操作系统实现。比如Linux的LVM对数据文件进行管理。</p>
<h5>4,逻辑备份</h5>
<ul>
<li>mysqldump</li>
<li>SELECT INTO...OUTFILE</li>
</ul>
<h5>5,主从复制</h5>
<p>主从复制是MySQL的一种高可用解决方案,主要有如下三个步骤。</p>
<ol>
<li>master节点将数据更改记录到bin-log日志中。</li>
<li>slave节点把主服务的bin-log日志复制到自己relay-log日志里。</li>
<li>slave节点从做relay-log日志,把数据更改更新到自己的数据库上,以到达数据和master节点最终一致。</li>
</ol>
<hr />
<aside>
<nav>
<ul class="articles-timeline">
<li class="previous-article">« <a href="./mysqlgao-ke-yong-fang-an.html"
title="Previous: MySQL高可用方案">MySQL高可用方案</a></li>
<li class="next-article"><a href="./rabbitmqxi-lie-di-yi-pian.html"
title="Next: RabbitMQ系列第一篇 - 基本概念和常见工作模式">RabbitMQ系列第一篇 <small class="subtitle">基本概念和常见工作模式</small></a> »</li>
</ul>
</nav>
</aside>
</div>
<section id="article-sidebar" class="span2">
<h4>Published</h4>
<time itemprop="dateCreated" datetime="2018-10-10T00:00:00+08:00">10
10, 2018</time>
<!---->
<h4>Category</h4>
<a class="category-link"
href="./categories.html#du-shu-bi-ji-ref">读书笔记</a>
<h4>Tags</h4>
<ul class="list-of-tags tags-in-article">
<li><a href="./tags.html#db-ref">DB
<span>4</span>
</a></li>
<li><a href="./tags.html#mysql-ref">MySQL
<span>7</span>
</a></li>
<li><a href="./tags.html#sql-ref">SQL
<span>4</span>
</a></li>
</ul>
<h4>Stay in Touch</h4>
<div id="sidebar-social-link">
<a href="mailto:[email protected]" title="My Email Address" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="Mail" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#328cff"/><path d="m250 186c-46 0-69 35-69 74 0 44 29 72 68 72 43 0 73-32 73-75 0-44-34-71-72-71zm-1-37c30 0 57 13 77 33 0-22 35-22 35 1v150c-1 10 10 16 16 9 25-25 54-128-14-187-64-56-149-47-195-15-48 33-79 107-49 175 33 76 126 99 182 76 28-12 41 26 12 39-45 19-168 17-225-82-38-68-36-185 67-248 78-46 182-33 244 32 66 69 62 197-2 246-28 23-71 1-71-32v-11c-20 20-47 32-77 32-57 0-108-51-108-108 0-58 51-110 108-110" fill="#fff"/></svg>
</a>
<a href="https://github.com/boyaziqi" title="catsaction Github Repository" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="GitHub" role="img" viewBox="0 0 512 512"><rect width="512" height="512" rx="15%" fill="#1B1817"/><path fill="#fff" d="M335 499c14 0 12 17 12 17H165s-2-17 12-17c13 0 16-6 16-12l-1-50c-71 16-86-28-86-28-12-30-28-37-28-37-24-16 1-16 1-16 26 2 40 26 40 26 22 39 59 28 74 22 2-17 9-28 16-35-57-6-116-28-116-126 0-28 10-51 26-69-3-6-11-32 3-67 0 0 21-7 70 26 42-12 86-12 128 0 49-33 70-26 70-26 14 35 6 61 3 67 16 18 26 41 26 69 0 98-60 120-117 126 10 8 18 24 18 48l-1 70c0 6 3 12 16 12z"/></svg>
</a>
<a href="https://www.linkedin.com/feed/" title="My LinkedIn" target="_blank" rel="nofollow noopener noreferrer">
<svg xmlns="http://www.w3.org/2000/svg" aria-label="LinkedIn" role="img" viewBox="0 0 512 512" fill="#fff"><rect width="512" height="512" rx="15%" fill="#0077b5"/><circle cx="142" cy="138" r="37"/><path stroke="#fff" stroke-width="66" d="M244 194v198M142 194v198"/><path d="M276 282c0-20 13-40 36-40 24 0 33 18 33 45v105h66V279c0-61-32-89-76-89-34 0-51 19-59 32"/></svg>
</a>
</div>
<h4>Friendship Links</h4>
<ul class="list-of-tags tags-in-article">
<li>
<a href="https://leetcode-cn.com/" title="力扣中国站点" target="_blank" rel="nofollow noopener noreferrer">
LeetCode
</a>
</li>
<li>
<a href="https://coolshell.cn/about" title="陈皓酷壳" target="_blank" rel="nofollow noopener noreferrer">
CoolShell
</a>
</li>
<li>
<a href="https://yikun.github.io/" title="姜毅坤博客" target="_blank" rel="nofollow noopener noreferrer">
Yikun
</a>
</li>
<li>
<a href="https://www.nowcoder.com/" title="牛客网" target="_blank" rel="nofollow noopener noreferrer">
牛客网
</a>
</li>
</ul>
</section>
</div>
</article>
</div>
<div class="span1"></div>
</div>
</div>
</div>
<footer>
<div>
<span class="site-name">CatsAction's blog</span> - It's a wonderful world
</div>
<div id="fpowered">
Powered by: <a href="http://getpelican.com/" title="Pelican Home Page" target="_blank" rel="nofollow noopener noreferrer">Pelican</a>
Theme: <a href="https://elegant.oncrashreboot.com/" title="Theme Elegant Home Page" target="_blank" rel="nofollow noopener noreferrer">Elegant</a>
</div>
</footer> <script src="//code.jquery.com/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>
<script>
function validateForm(query)
{
return (query.length > 0);
}
</script>
<script>
(function () {
if (window.location.hash.match(/^#comment-\d+$/)) {
$('#comment_thread').collapse('show');
}
})();
window.onhashchange=function(){
if (window.location.hash.match(/^#comment-\d+$/))
window.location.reload(true);
}
$('#comment_thread').on('shown', function () {
var link = document.getElementById('comment-accordion-toggle');
var old_innerHTML = link.innerHTML;
$(link).fadeOut(200, function() {
$(this).text('Click here to hide comments').fadeIn(200);
});
$('#comment_thread').on('hidden', function () {
$(link).fadeOut(200, function() {
$(this).text(old_innerHTML).fadeIn(200);
});
})
})
</script>
</body>
<!-- Theme: Elegant built for Pelican
License : MIT -->
</html>