MySQL 8查詢性能優化
內容描述
主要內容 ● 監控性能,找出效果不佳的查詢 ● 選取要優化的查詢,**限度地提高收益 ● 使用EXPLAIN ANALYZE和Visual Explain等工具來分析查詢 ● 借助多種策略改進慢查詢 ● 正確使用索引和直方圖,創建快速的執行計劃 ● 瞭解並分析鎖,從而解決爭用問題,提升系統吞吐量
目錄大綱
第Ⅰ部分 入門
第1章 MySQL性能優化 2
1.1 通盤考慮 2
1.2 監控 3
1.3 查詢的生命週期 4
1.4 本章小結 5
第2章 查詢優化方法論 6
2.1 綜述 6
2.2 核實問題 7
2.3 確定原因 8
2.4 確定解決方案 8
2.5 實施解決方案 8
2.6 主動工作 10
2.7 本章小結 11
第3章 使用Sysbench進行基準測試 12
3.1 #佳實踐 12
3.2 標準TPC基準測試 14
3.3 通用的基準測試工具 14
3.4 安裝Sysbench 15
3.5 執行基準測試 20
3.6 創建自定義基準測試 25
3.6.1 自定義腳本概述 25
3.6.2 定義選項 27
3.6.3 run命令 27
3.6.4 prepare命令 29
3.6.5 cleanup命令 31
3.6.6 註冊命令 31
3.7 本章小結 32
第4章 測試數據 34
4.1 下載示例數據庫 34
4.2 world數據庫 35
4.2.1 方案 35
4.2.2 安裝 36
4.3 world_x數據庫 36
4.3.1 方案 36
4.3.2 安裝 36
4.4 sakila數據庫 37
4.4.1 方案 37
4.4.2 安裝 40
4.5 employees數據庫 41
4.5.1 方案 41
4.5.2 安裝 43
4.6 其他數據庫 44
4.7 本章小結 44
第Ⅱ部分 信息來源
第5章 performance庫 46
5.1 術語 46
5.2 線程 47
5.3 instrument 50
5.4 消費者 51
5.5 事件 53
5.5.1 事件類型 53
5.5.2 事件範圍 53
5.5.3 事件嵌套 54
5.5.4 事件屬性 55
5.6 Actor與對象 56
5.7 摘要 56
5.8 表類型 57
5.9 動態配置 58
5.10 本章小結 59
第6章 sys庫 61
6.1 sys庫配置 62
6.2 格式化函數 64
6.3 視圖 65
6.4 輔助函數與過程 66
6.5 本章小結 67
第7章 information庫 68
7.1 何為information庫 68
7.2 權限 69
7.3 視圖 69
7.3.1 系統信息 69
7.3.2 方案信息 70
7.3.3 性能信息 74
7.3.4 權限信息 77
7.4 索引統計數據緩存 78
7.5 本章小結 79
第8章 SHOW語句 80
8.1 與information庫的關係 81
8.2 與performance庫的關係 82
8.3 引擎狀態 83
8.4 複製與二進制日誌 84
8.4.1 列出二進制日誌 84
8.4.2 查看日誌事件 84
8.4.3 顯示連接的副本 87
8.5 其他語句 88
8.6 本章小結 90
第9章 慢查詢日誌 92
9.1 配置 93
9.2 日誌事件 95
9.3 匯總 96
9.4 本章小結 98
第Ⅲ部分 工 具
第10章 MySQL Enterprise Monitor 100
10.1 概述 100
10.2 安裝 102
10.2.1 下載 102
10.2.2 安裝 104
10.3 啟動和停止Service Manager 109
10.3.1 在Microsoft Windows中啟動和停止Service Manager 109
10.3.2 在Linux中啟動和停止Service Manager 110
10.4 添加MySQL實例 111
10.5 圖形管理界面 113
10.5.1 通用導航 113
10.5.2 建議器 114
10.5.3 時序圖 116
10.5.4 查詢分析器 117
10.6 本章小結 118
第11章 MySQL Workbench 119
11.1 安裝 120
11.1.1 Microsoft Windows 120
11.1.2 Enterprise Linux 7 124
11.1.3 Debian和Ubuntu 127
11.2 創建連接 129
11.3 使用MySQL Workbench 130
11.3.1 概要 130
11.3.2 配置 131
11.3.3 安全設置 133
11.3.4 重新格式化查詢 133
11.4 EER圖 134
11.5 本章小結 135
第12章 MySQL shell 136
12.1 概要 136
12.1.1 安裝MySQL shell 137
12.1.2 調用MySQL shell 137
12.1.3 創建連接 137
12.1.4 語言模式 139
12.1.5 內建幫助 140
12.1.6 內建全局對象 141
12.2 提示符 141
12.2.1 內置提示符 141
12.2.2 自定義提示符 143
12.2.3 Powerline和Awesome字體 145
12.3 使用外部模塊 146
12.4 報表基礎架構 148
12.4.1 報表信息和幫助 148
12.4.2 執行報表 149
12.4.3 添加自己的報表 151
12.5 插件 155
12.6 本章小結 161
第Ⅳ部分 方案考量與查詢優化器
第13章 數據類型 164
13.1 為何是數據類型 164
13.1.1 數據驗證 165
13.1.2 文檔 166
13.1.3 優化存儲 166
13.1.4 性能 167
13.1.5 正確排序 167
13.2 MySQL的數據類型 167
13.2.1 數值類型 168
13.2.2 日期和時間類型 169
13.2.3 字符串與二進制類型 169
13.2.4 JSON數據類型 171
13.2.5 空間數據類型 172
13.2.6 混合數據類型 173
13.3 性能 174
13.4 應該選擇何種數據類型 174
13.5 本章小結 176
第14章 索引 177
14.1 什麼是索引 177
14.2 索引的概念 178
14.2.1 鍵與索引 178
14.2.2 唯#一索引 178
14.2.3 主鍵 179
14.2.4 二級索引 180
14.2.5 簇聚索引 180
14.2.6 覆蓋索引 180
14.3 索引的限制 181
14.4 SQL語法 181
14.4.1 創建帶有索引的表 182
14.4.2 添加索引 182
14.4.3 移除索引 183
14.5 索引的缺點是什麼? 184
14.5.1 存儲 184
14.5.2 更新索引 185
14.5.3 優化器 185
14.6 索引類型 186
14.6.1 B-tree索引 186
14.6.2 全文索引 188
14.6.3 空間索引 189
14.6.4 多值索引 190
14.6.5 哈希索引 193
14.7 索引的特性 195
14.7.1 函數索引 196
14.7.2 前綴索引 196
14.7.3 不可見索引 197
14.7.4 降序索引 198
14.7.5 分區與索引 198
14.7.6 自生成索引 200
14.8 InnoDB與索引 200
14.8.1 簇聚索引 201
14.8.2 二級索引 201
14.8.3 建議 201
14.8.4 #佳用例 201
14.9 索引策略 202
14.9.1 何時添加或者移除索引? 202
14.9.2 主鍵的選擇 203
14.9.3 添加二級索引 203
14.9.4 多列索引 204
14.9.5 覆蓋索引 205
14.10 本章小結 205
第15章 索引統計信息 206
15.1 何為索引統計信息? 206
15.2 InnoDB與索引統計信息 207
15.2.1 統計信息是如何被收集的? 207
15.2.2 頁採樣 208
15.2.3 事務隔離級別 209
15.2.4 配置統計信息類型 209
15.3 持久索引統計信息 209
15.3.1 配置 210
15.3.2 索引統計信息表 211
15.4 臨時索引統計信息 214
15.5 監控 215
15.5.1 information庫中的STATISTICS視圖 215
15.5.2 SHOW INDEX 語句 217
15.5.3 information庫中的INN0DB_TABLESTATS視圖 219
15.5.4 information庫中的TABLES視圖及SHOW TABLE STATUS語句 220
15.6 更新統計信息 223
15.6.1 自動更新 223
15.6.2 ANALYZE TABLE語句 224
15.6.3 mysqlcheck程序 225
15.7 本章小結 227
第16章 直方圖 229
16.1 何為直方圖? 229
16.2 何時應該添加直方圖信息? 230
16.3 直方圖內部信息 231
16.3.1 bucket 231
16.3.2 累積頻率 232
16.3.3 直方圖類型 234
16.4 直方圖的添加與維護 236
16.4.1 直方圖的創建與更新 236
16.4.2 採樣 237
16.4.3 刪除直方圖 238
16.5 查看直方圖數據 238
16.6 直方圖報告示例 239
16.6.1 列出所有直方圖 240
16.6.2 列出一個直方圖的所有信息 240
16.6.3 列出一個單值直方圖的桶信息 241
16.6.4 列出一個等高直方圖的桶信息 243
16.7 查詢示例 244
16.8 本章小結 247
第17章 查詢優化器 248
17.1 轉換 249
17.2 基於成本的優化 249
17.2.1 基礎:單表SELECT操作 250
17.2.2 表聯接順序 251
17.2.3 默認過濾效果 251
17.2.4 查詢成本 252
17.3 聯接算法 254
17.3.1 嵌套循環 254
17.3.2 塊嵌套循環 257
17.3.3 哈希聯接 260
17.4 聯接優化 263
17.4.1 索引合併 263
17.4.2 多範圍讀(MRR) 269
17.4.3 批量key訪問(BKA) 270
17.4.4 其他優化 271
17.5 配置優化器 274
17.5.1 引擎成本 275
17.5.2 服務器成本 275
17.5.3 優化器開關 277
17.5.4 優化器提示 278
17.5.5 索引提示 281
17.5.6 配置選項 282
17.6 資源組 282
17.6.1 獲取資源組相關信息 283
17.6.2 管理資源組 283
17.6.3 分配資源組 285
17.6.4 性能考量 286
17.7 本章小結 287
第18章 鎖原理與監控 288
18.1 為何會需要鎖? 288
18.2 鎖訪問級別 289
18.3 鎖粒度 289
18.3.1 用戶級別鎖 289
18.3.2 刷新鎖 291
18.3.3 元數據鎖 292
18.3.4 顯式表鎖 295
18.3.5 隱式表鎖 295
18.3.6 記錄鎖 297
18.3.7 gap鎖、next-key鎖以及預測鎖 299
18.3.8 插入意向鎖 300
18.3.9 自增鎖 302
18.3.10 備份鎖 302
18.3.11 日誌鎖 304
18.4 獲取鎖失敗 304
18.4.1 元數據鎖和備份鎖等待超時 305
18.4.2 InnoDB鎖等待超時 305
18.4.3 死鎖 306
18.5 減少鎖相關的問題 309
18.5.1 事務大小與期限 309
18.5.2 索引 309
18.5.3 記錄訪問順序 310
18.5.4 事務隔離級別 310
18.5.5 搶占鎖 312
18.6 監控鎖 313
18.6.1 performance庫 313
18.6.2 sys庫 314
18.6.3 狀態計數器與InnoDB指標 314
18.6.4 InnoDB鎖監控與死鎖日誌 315
18.7 本章小結 318
第Ⅴ部分 查詢分析
第19章 查找待優化的查詢 320
19.1 performance庫 321
19.1.1 語句事件表 321
19.1.2 prepared語句的匯總 325
19.1.3 表的I/O匯總 327
19.1.4 文件 I/O匯總信息 332
19.1.5 錯誤匯總表 334
19.2 sys庫 335
19.2.1 語句視圖 335
19.2.2 表I/O視圖 337
19.2.3 文件I/O視圖 338
19.2.4 語句性能分析器 340
19.3 MySQL Workbench 343
19.3.1 性能報告 344
19.3.2 客戶端連接報告 346
19.4 MySQL Enterprise Monitor 346
19.4.1 查詢分析器 346
19.4.2 時間序列圖 349
19.4.3 即席查詢報告 350
19.5 慢查詢日誌 352
19.6 本章小結 352
第20章 分析查詢 354
20.1 EXPLAIN用法 355
20.1.1 顯式查詢的用法 355
20.1.2 EXPLAIN ANALYZE 355
20.1.3 連接的用法 356
20.2 EXPLAIN格式 357
20.2.1 傳統格式 358
20.2.2 JSON格式 359
20.2.3 樹狀格式 362
20.2.4 Visual Explain 364
20.3 EXPLAIN輸出 368
20.3.1 EXPLAIN字段 368
20.3.2 選擇類型 371
20.3.3 訪問類型 372
20.3.4 Extra信息 376
20.4 EXPLAIN示例 377
20.4.1 單表,全表掃描 378
20.4.2 單表,索引訪問 379
20.4.3 兩張表和覆蓋索引 380
20.4.4 多列索引 381
20.4.5 兩張表並帶有子查詢和排序 382
20.5 優化器跟踪 384
20.6 performance庫事件分析 387
20.6.1 檢查存儲過程 387
20.6.2 分析階段事件 391
20.6.3 使用sys.ps_trace_thread( )過程進行分析 393
20.6.4 使用ps_trace_statement_digest( )過程進行分析 396
20.7 本章小結 400
第21章 事務 401
21.1 事務的影響 401
21.1.1 鎖 402
21.1.2 undo日誌 402
21.2 INN0DB_TRX 403
21.3 InnoDB監視器 406
21.4 INN0DB_METRICS和sys.metrics 407
21.5 performance庫事務 410
21.5.1 事務事件及其語句 410
21.5.2 事務匯總表 416
21.6 本章小結 417
第22章 診斷鎖爭用 418
22.1 刷新鎖 419
22.1.1 症狀 419
22.1.2 原因 419
22.1.3 構建 420
22.1.4 調研 420
22.1.5 解決方案 423
22.1.6 預防 423
22.2 元數據鎖和方案鎖 424
22.2.1 症狀 424
22.2.2 原因 424
22.2.3 構建 424
22.2.4 調研 425
22.2.5 解決方案 431
22.2.6 預防 431
22.3 記錄鎖 432
22.3.1 症狀 432
22.3.2 原因 434
22.3.3 構建 435
22.3.4 調研 435
22.3.5 解決方案 436
22.3.6 預防 437
22.4 死鎖 437
22.4.1 症狀 437
22.4.2 原因 438
22.4.3 構建 438
22.4.4 調研 439
22.4.5 解決方案 444
22.4.6 預防 444
22.5 本章小結 445
第Ⅵ部分 提升查詢性能
第23章 配置 448
23.1 #佳實踐 448
23.2 InnoDB綜述 451
23.3 InnoDB緩衝池 452
23.3.1 緩衝池大小 453
23.3.2 緩衝池實例 455
23.3.3 轉儲緩衝池 455
23.3.4 舊塊子列表 455
23.3.5 刷新頁 457
23.4 重做日誌 458
23.4.1 日誌緩衝區 459
23.4.2 日誌文件 459
23.5 並行查詢執行 461
23.6 查詢緩衝區 462
23.7 內部臨時表 463
23.8 本章小結 465
第24章 改變查詢計劃 466
24.1 測試數據 466
24.2 出現過多全表掃描的症狀 467
24.3 錯誤查詢 468
24.4 未使用索引 470
24.4.1 不在多列索引的靠左位置 471
24.4.2 數據類型不匹配 473
24.4.3 函數依賴 476
24.5 改善索引的使用情況 478
24.5.1 添加覆蓋索引 479
24.5.2 錯誤索引 480
24.5.3 重寫複雜索引條件 487
24.6 重寫複雜查詢 488
24.6.1 公共表表達式(CTE) 489
24.6.2 窗口函數 493
24.6.3 使用聯接來重寫子查詢 494
24.6.4 將查詢拆分為多個部分 495
24.7 隊列系統:SKIP LOCKED 496
24.8 多個OR或者IN條件 498
24.9 本章小結 502
第25章 DDL與批量數據加載 504
25.1 方案更改 505
25.1.1 算法 505
25.1.2 其他考量 506
25.1.3 刪除或者截斷表 506
25.2 數據加載的一般性考量 507
25.3 以主鍵順序插入 516
25.3.1 自增長主鍵 516
25.3.2 插入已有數據 517
25.3.3 UUID主鍵 518
25.4 InnoDB緩衝池與二級索引 519
25.5 配置 521
25.6 事務與加載方式 522
25.7 MySQL shell並行數據加載 522
25.8 本章小結 524
第26章 複製 526
26.1 複製概述 527
26.2 監控 528
26.2.1 連接表 529
26.2.2 applier表 531
26.2.3 日誌狀態 533
26.2.4 組複製表 534
26.3 連接 534
26.3.1 複製事件 534
26.3.2 網絡 535
26.3.3 維護源信息 536
26.3.4 寫入中繼日誌 536
26.4 applier線程 536
26.4.1 並行applier 537
26.4.2 主鍵 538
26.4.3 放寬數據安全 538
26.4.4 複製過濾器 539
26.5 將工作負載卸載到副本 540
26.5.1 讀操作的橫向擴展 540
26.5.2 任務分離 540
26.6 本章小結 541
第27章 緩存 542
27.1 緩存,無處不在 542
27.2 MySQL中的緩存 543
27.2.1 緩存表 543
27.2.2 直方圖統計信息 545
27.3 Memcached 546
27.3.1 獨立服務器模式下的Memcached 547
27.3.2 MySQL InnoDB Memcached插件 549
27.4 ProxySQL 552
27.5 緩存技巧 558
27.6 本章小結 559
作者介紹
自2006年以來,Jesper Wisborg Krogh先後以SQL開發人員和數據庫管理員的身份參與到MySQL數據庫工作中,並且作為MySQL技術支持團隊的一員,工作了8年之久。
他曾在MySQL Connect和Oracle OpenWorld上多次發表演講。除了出版相關書籍外,他也會定期撰寫一些以MySQL為主題的博客文章,並為Oracle知識庫撰寫了約800份文檔。
此外,Jesper Wisborg Krogh也為MySQL中的sys庫,以及MySQL 5.6等相關的OCP認證考試做出了許多貢獻。
在2006年轉向MySQL及軟件開發之前,Jesper Wisborg Krogh獲得計算化學的博士學位。他現在居住在澳大利亞的悉尼,ping時喜歡在戶外散步、旅行以及閱讀等。
其研究領域涉及MySQL集群、MySQL Enterprise Backup(MEB)、性能優化,以及performance庫和sys庫等。