高性能Mysql学习记录

第1章 MySQL 架构与历史 38
1.1 MySQL 逻辑架构 38
1.1.1 连接管理与安全性 39
1.1.2 优化与执行 40
1.2 并发控制 40
1.2.1 读写锁 41
1.2.2 锁粒度 41
1.3 事务 43
1.3.1 隔离级别 45
1.3.2 死锁 46
1.3.3 事务日志 47
1.3.4 MySQL 中的事务 47
1.4 多版本并发控制 49
1.5 MySQL 的存储引擎 50
1.5.1 InnoDB 存储引擎 53
1.5.2 MyISAM 存储引擎 54
1.5.3 MySQL 内建的其他存储引擎 56
1.5.4 第三方存储引擎 59
1.5.5 选择合适的引擎 61
1.5.6 转换表的引擎 64
1.6 MySQL 时间线(Timeline) 66
1.7 MySQL 的开发模式 69
1.8 总结 70
第2章 MySQL 基准测试 72
2.1 为什么需要基准测试 72
2.2 基准测试的策略 74
2.2.1 测试何种指标 75
2.3 基准测试方法 77
2.3.1 设计和规划基准测试 78
2.3.2 基准测试应该运行多长时间 79
2.3.3 获取系统性能和状态 80
2.3.4 获得准确的测试结果 81
2.3.5 运行基准测试并分析结果 83
2.3.6 绘图的重要性 84
2.4 基准测试工具 86
2.4.1 集成式测试工具 86
2.4.2 单组件式测试工具 87
2.5 基准测试案例 89
2.5.1 http_load 90
2.5.2 MySQL 基准测试套件 91
2.5.3 sysbench 92
2.5.4 数据库测试套件中的dbt2 TPC-C 测试 97
2.5.5 Percona 的TPCC-MySQL 测试工具 100
2.6 总结 102
第3章 服务器性能剖析 104
3.1 性能优化简介 104
3.1.1 通过性能剖析进行优化 106
3.1.2 理解性能剖析 108
3.2 对应用程序进行性能剖析 109
3.2.1 测量PHP 应用程序 111
3.3 剖析MySQL 查询 114
3.3.1 剖析服务器负载 114
3.3.2 剖析单条查询 118
3.3.3 使用性能剖析 124
3.4 诊断间歇性问题 125
3.4.1 单条查询问题还是服务器问题 126
3.4.2 捕获诊断数据 130
3.4.3 一个诊断案例 135
3.5 其他剖析工具 143
3.5.1 使用USER_STATISTICS 表 143
3.5.2 使用strace 144
3.6 总结 145
第4章 Schema 与数据类型优化 148
4.1 选择优化的数据类型 148
4.1.1 整数类型 150
4.1.2 实数类型 150
4.1.3 字符串类型 151
4.1.4 日期和时间类型 158
4.1.5 位数据类型 160
4.1.6 选择标识符(identifier) 162
4.1.7 特殊类型数据 164
4.2 MySQL schema 设计中的陷阱 164
4.3 范式和反范式 166
4.3.1 范式的优点和缺点 167
4.3.2 反范式的优点和缺点 167
4.3.3 混用范式化和反范式化 168
4.4 缓存表和汇总表 169
4.4.1 物化视图 171
4.4.2 计数器表 172
4.5 加快ALTER TABLE 操作的速度 173
4.5.1 只修改.frm 文件 174
4.5.2 快速创建MyISAM 索引 176
4.6 总结 177
第5章 创建高性能的索引 178
5.1 索引基础 178
5.1.1 索引的类型 179
5.2 索引的优点 189
5.3 高性能的索引策略 190
5.3.1 独立的列 190
5.3.2 前缀索引和索引选择性 190
5.3.3 多列索引 194
5.3.4 选择合适的索引列顺序 196
5.3.5 聚簇索引 199
5.3.6 覆盖索引 208
5.3.7 使用索引扫描来做排序 212
5.3.8 压缩(前缀压缩)索引 214
5.3.9 冗余和重复索引 215
5.3.10 未使用的索引 218
5.3.11 索引和锁 218
5.4 索引案例学习 220
5.4.1 支持多种过滤条件 220
5.4.2 避免多个范围条件 222
5.4.3 优化排序 223
5.5 维护索引和表 224
5.5.1 找到并修复损坏的表 224
5.5.2 更新索引统计信息 225
5.5.3 减少索引和数据的碎片 227
5.6 总结 229
第6章 查询性能优化 232
6.1 为什么查询速度会慢 232
6.2 慢查询基础:优化数据访问 233
6.2.1 是否向服务器请求了不需要的数据 233
6.2.2 MySQL 是否在扫描额外的记录 235
6.3 重构查询的方式 238
6.3.1 一个复杂查询还是多个简单查询 238
6.3.2 切分查询 239
6.3.3 分解关联查询 240
6.4 查询执行的基础 241
6.4.1 MySQL 客户端/服务器通信协议 242
6.4.2 查询缓存 245
6.4.3 查询优化处理 245
6.4.4 查询执行引擎 259
6.4.5 返回结果给客户端 260
6.5 MySQL 查询优化器的局限性 260
6.5.1 关联子查询 260
6.5.2 UNION 的限制 265
6.5.3 索引合并优化 265
6.5.4 等值传递 266
6.5.5 并行执行 266
6.5.6 哈希关联 266
6.5.7 松散索引扫描 266
6.5.8 最大值和最小值优化 268
6.5.9 在同一个表上查询和更新 269
6.6 查询优化器的提示(hint) 269
6.7 优化特定类型的查询 273
6.7.1 优化COUNT() 查询 273
6.7.2 优化关联查询 276
6.7.3 优化子查询 276
6.7.4 优化GROUP BY 和DISTINCT 276
6.7.5 优化LIMIT 分页 278
6.7.6 优化SQL_CALC_FOUND_ROWS 280
6.7.7 优化UNION 查询 280
6.7.8 静态查询分析 281
6.7.9 使用用户自定义变量 281
6.8 案例学习 288
6.8.1 使用MySQL 构建一个队列表 288
6.8.2 计算两点之间的距离 291
6.8.3 使用用户自定义函数 294
6.9 总结 295
第7章 MySQL 高级特性 296
7.1 分区表 296
7.1.1 分区表的原理 297
7.1.2 分区表的类型 298
7.1.3 如何使用分区表 299
7.1.4 什么情况下会出问题 300
7.1.5 查询优化 303
7.1.6 合并表 304
7.2 视图 307
7.2.1 可更新视图 309
7.2.2 视图对性能的影响 310
7.2.3 视图的限制 311
7.3 外键约束 312
7.4 在MySQL 内部存储代码 313
7.4.1 存储过程和函数 315
7.4.2 触发器 316
7.4.3 事件 318
7.4.4 在存储程序中保留注释 320
7.5 游标 320
7.6 绑定变量 321
7.6.1 绑定变量的优化 323
7.6.2 SQL 接口的绑定变量 323
7.6.3 绑定变量的限制 325
7.7 用户自定义函数 326
7.8 插件 327
7.9 字符集和校对 328
7.9.1 MySQL 如何使用字符集 329
7.9.2 选择字符集和校对规则 332
7.9.3 字符集和校对规则如何影响查询 333
7.10 全文索引 336
7.10.1 自然语言的全文索引 337
7.10.2 布尔全文索引 339
7.10.3 MySQL5.1 中全文索引的变化 340
7.10.4 全文索引的限制和替代方案 341
7.10.5 全文索引的配置和优化 343
7.11 分布式(XA)事务 344
7.11.1 内部XA 事务 344
7.11.2 外部XA 事务 345
7.12 查询缓存 346
7.12.1 MySQL 如何判断缓存命中 346
7.12.2 查询缓存如何使用内存 348
7.12.3 什么情况下查询缓存能发挥作用 350
7.12.4 如何配置和维护查询缓存 353
7.12.5 InnoDB 和查询缓存 356
7.12.6 通用查询缓存优化 357
7.12.7 查询缓存的替代方案 358
7.13 总结 358
第8章 优化服务器设置 362
8.1 MySQL 配置的工作原理 363
8.1.1 语法、作用域和动态性 364
8.1.2 设置变量的副作用 365
8.1.3 入门 368
8.1.4 通过基准测试迭代优化 369
8.2 什么不该做 370
8.3 创建MySQL 配置文件 372
8.3.1 检查MySQL 服务器状态变量 376
8.4 配置内存使用 377
8.4.1 MySQL 可以使用多少内存? 377
8.4.2 每个连接需要的内存 378
8.4.3 为操作系统保留内存 378
8.4.4 为缓存分配内存 379
8.4.5 InnoDB 缓冲池(Buffer Pool) 379
8.4.6 MyISAM 键缓存(Key Caches) 381
8.4.7 线程缓存 383
8.4.8 表缓存(Table Cache) 384
8.4.9 InnoDB 数据字典(Data Dictionary) 385
8.5 配置MySQL 的I/O 行为 386
8.5.1 InnoDB I/O 配置 386
8.5.2 MyISAM 的I/O 配置 398
8.6 配置MySQL 并发 400
8.6.1 InnoDB 并发配置 401
8.6.2 MyISAM 并发配置 402
8.7 基于工作负载的配置 403
8.7.1 优化BLOB 和TEXT 的场景 404
8.7.2 优化排序(Filesorts) 405
8.8 完成基本配置 406
8.9 安全和稳定的设置 408
8.10 高级InnoDB 设置 411
8.11 总结 413
第9章 操作系统和硬件优化 414
9.1 什么限制了MySQL 的性能 414
9.2 如何为MySQL 选择CPU 415
9.2.1 哪个更好:更快的CPU 还是更多的CPU 415
9.2.2 CPU 架构 417
9.2.3 扩展到多个CPU 和核心 418
9.3 平衡内存和磁盘资源 419
9.3.1 随机I/O 和顺序I/O 420
9.3.2 缓存,读和写 421
9.3.3 工作集是什么 422
9.3.4 找到有效的内存/磁盘比例 423
9.3.5 选择硬盘 424
9.4 固态存储 426
9.4.1 闪存概述 427
9.4.2 闪存技术 428
9.4.3 闪存的基准测试 429
9.4.4 固态硬盘驱动器(SSD) 430
9.4.5 PCIe 存储设备 432
9.4.6 其他类型的固态存储 433
9.4.7 什么时候应该使用闪存 433
9.4.8 使用Flashcache 434
9.4.9 优化固态存储上的MySQL 436
9.5 为备库选择硬件 439
9.6 RAID 性能优化 440
9.6.1 RAID 的故障转移、恢复和镜像 442
9.6.2 平衡硬件RAID 和软件RAID 443
9.6.3 RAID 配置和缓存 444
9.7 SAN 和NAS 447
9.7.1 SAN 基准测试 448
9.7.2 使用基于NFS 或SMB 的SAN 449
9.7.3 MySQL 在SAN 上的性能 449
9.7.4 应该用SAN 吗 450
9.8 使用多磁盘卷 451
9.9 网络配置 453
9.10 选择操作系统 455
9.11 选择文件系统 456
9.12 选择磁盘队列调度策略 458
9.13 线程 459
9.14 内存交换区 459
9.15 操作系统状态 461
9.15.1 如何阅读vmstat 的输出 462
9.15.2 如何阅读iostat 的输出 463
9.15.3 其他有用的工具 465
9.15.4 CPU 密集型的机器 465
9.15.5 I/O 密集型的机器 466
9.15.6 发生内存交换的机器 467
9.15.7 空闲的机器 467
9.16 总结 468
第10章 复制 470
10.1 复制概述 470
10.1.1 复制解决的问题 471
10.1.2 复制如何工作 472
10.2 配置复制 473
10.2.1 创建复制账号 474
10.2.2 配置主库和备库 474
10.2.3 启动复制 476
10.2.4 从另一个服务器开始复制 478
10.2.5 推荐的复制配置 480
10.3 复制的原理 482
10.3.1 基于语句的复制 482
10.3.2 基于行的复制 483
10.3.3 基于行或基于语句:哪种更优 483
10.3.4 复制文件 485
10.3.5 发送复制事件到其他备库 486
10.3.6 复制过滤器 487
10.4 复制拓扑 489
10.4.1 一主库多备库 489
10.4.2 主动- 主动模式下的主- 主复制 490
10.4.3 主动- 被动模式下的主- 主复制 492
10.4.4 拥有备库的主- 主结构 493
10.4.5 环形复制 494
10.4.6 主库、分发主库以及备库 495
10.4.7 树或金字塔形 497
10.4.8 定制的复制方案 497
10.5 复制和容量规划 502
10.5.1 为什么复制无法扩展写操作 503
10.5.2 备库什么时候开始延迟 503
10.5.3 规划冗余容量 504
10.6 复制管理和维护 505
10.6.1 监控复制 505
10.6.2 测量备库延迟 506
10.6.3 确定主备是否一致 506
10.6.4 从主库重新同步备库 507
10.6.5 改变主库 508
10.6.6 在一个主-主配置中交换角色 513
10.7 复制的问题和解决方案 514
10.7.1 数据损坏或丢失的错误 514
10.7.2 使用非事务型表 517
10.7.3 混合事务型和非事务型表 517
10.7.4 不确定语句 518
10.7.5 主库和备库使用不同的存储引擎 518
10.7.6 备库发生数据改变 518
10.7.7 不唯一的服务器ID 519
10.7.8 未定义的服务器ID 519
10.7.9 对未复制数据的依赖性 519
10.7.10 丢失的临时表 520
10.7.11 不复制所有的更新 521
10.7.12 InnoDB 加锁读引起的锁争用 521
10.7.13 在主-主复制结构中写入两台主库 523
10.7.14 过大的复制延迟 525
10.7.15 来自主库的过大的包 528
10.7.16 受限制的复制带宽 528
10.7.17 磁盘空间不足 529
10.7.18 复制的局限性 529
10.8 复制有多快 529
10.9 MySQL 复制的高级特性 531
10.10 其他复制技术 533
10.11 总结 535
第11章 可扩展的MySQL 538
11.1 什么是可扩展性 538
11.1.1 正式的可扩展性定义 540
11.2 扩展MySQL 544
11.2.1 规划可扩展性 544
11.2.2 为扩展赢得时间 545
11.2.3 向上扩展 546
11.2.4 向外扩展 547
11.2.5 通过多实例扩展 562
11.2.6 通过集群扩展 563
11.2.7 向内扩展 567
11.3 负载均衡 569
11.3.1 直接连接 571
11.3.2 引入中间件 574
11.3.3 一主多备间的负载均衡 577
11.4 总结 578
第12章 高可用性 580
12.1 什么是高可用性 580
12.2 导致宕机的原因 581
12.3 如何实现高可用性 582
12.3.1 提升平均失效时间(MTBF) 582
12.3.2 降低平均恢复时间(MTTR) 584
12.4 避免单点失效 585
12.4.1 共享存储或磁盘复制 586
12.4.2 MySQL 同步复制 588
12.4.3 基于复制的冗余 592
12.5 故障转移和故障恢复 593
12.5.1 提升备库或切换角色 595
12.5.2 虚拟IP 地址或IP 接管 595
12.5.3 中间件解决方案 596
12.5.4 在应用中处理故障转移 597
12.6 总结 597
第13章 云端的MySQL 600
13.1 云的优点、缺点和相关误解 601
13.2 MySQL 在云端的经济价值 603
13.3 云中的MySQL 的可扩展性和高可用性 604
13.4 四种基础资源 605
13.5 MySQL 在云主机上的性能 606
13.5.1 在云端的MySQL 基准测试 608
13.6 MySQL 数据库即服务(DBaaS) 610
13.6.1 Amazon RDS 610
13.6.2 其他DBaaS 解决方案 611
13.7 总结 612
第14章 应用层优化 614
14.1 常见问题 614
14.2 Web 服务器问题 616
14.2.1 寻找最优并发度 618
14.3 缓存 619
14.3.1 应用层以下的缓存 620
14.3.2 应用层缓存 621
14.3.3 缓存控制策略 623
14.3.4 缓存对象分层 624
14.3.5 预生成内容 625
14.3.6 作为基础组件的缓存 626
14.3.7 使用HandlerSocket和memcached 626
14.4 拓展MySQL 627
14.5 MySQL 的替代品 627
14.6 总结 628
第15章 备份与恢复 630
15.1 为什么要备份 631
15.2 定义恢复需求 632
15.3 设计MySQL 备份方案 633
15.3.1 在线备份还是离线备份 634
15.3.2 逻辑备份还是物理备份 635
15.3.3 备份什么 638
15.3.4 存储引擎和一致性 640
15.4 管理和备份二进制日志 642
15.4.1 二进制日志格式 643
15.4.2 安全地清除老的二进制日志 644
15.5 备份数据 644
15.5.1 生成逻辑备份 644
15.5.2 文件系统快照 647
15.6 从备份中恢复 654
15.6.1 恢复物理备份 655
15.6.2 还原逻辑备份 656
15.6.3 基于时间点的恢复 659
15.6.4 更高级的恢复技术 661
15.6.5 InnoDB 崩溃恢复 662
15.7 备份和恢复工具 665
15.7.1 MySQL Enterprise Backup 665
15.7.2 Percona XtraBackup 665
15.7.3 mylvmbackup 666
15.7.4 Zmanda Recovery Manager 666
15.7.5 mydumper 666
15.7.6 mysqldump 666
15.8 备份脚本化 668
15.9 总结 670
第16章 MySQL 用户工具 672
16.1 接口工具 672
16.2 命令行工具集 673
16.3 SQL 实用集 674
16.4 监测工具 674
16.4.1 开源的监控工具 675
16.4.2 商业监控系统 677
16.4.3 Innotop 的命令行监控 679
16.5 总结 683
附录A MySQL 分支与变种 686
附录B MySQL 服务器状态 692
附录C 大文件传输 720
附录D EXPLAIN 724
附录E 锁的调试 740
附录F 在MySQL 上使用Sphinx 750
索引 776

posted @   O-ll-O  阅读(270)  评论(1编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示