MySQL技術大全:開發、優化與運維實戰:視頻教學版
內容描述
本書結合大量示例和實戰案例,全面、系統、深入地介紹了MySQL數據庫技術,
重點闡述了MySQL開發、優化和運維過程中的各個技術點。
本書對學習MySQL技術有較高的參考價值,尤其是環境搭建、
優化、維護和架構等內容可直接用於實際工作中。
本書共33章,分為6篇。第1篇“MySQL基礎”,介紹數據庫的定義、發展,
以及數據庫技術和MySQL數據庫的三大範式與存儲引擎。第2篇“環境搭建”,
介紹VMware虛擬機以及Windows、Mac OS X和CentOS操作系統的安裝,
並介紹如何在三大操作系統上安裝和配置MySQL。
第3篇“MySQL開發”,介紹MySQL中的數據庫操作、數據表操作、數據類型、
運算符、函數、數據變更、數據查詢、索引、視圖、存儲過程、觸發器、
分區、公用表表達式和生成列等。第4篇“MySQL優化”,介紹MySQL中的查詢優化、
索引優化、SQL語句優化、數據庫優化、服務器優化、應用程序優化及其他優化技術。
第5篇“MySQL維護”,介紹MySQL中各種命令行工具的使用,
以及各種日誌的開啟、查看、刪除與關閉,並介紹數據的備份與恢復及MySQL中的賬戶管理。
第6篇“MySQL架構”,介紹MySQL中的復制、讀寫分離環境搭建,以及如何實現MySQL的高可用等。
本書適合想全面學習MySQL的數據庫管理人員、開發人員、運維工程師和架構師閱讀,
也適合各大院校的學生及相關培訓機構的學員閱讀。
另外,本書還非常適合作為一本案頭手冊供相關技術人員隨查隨用。
本書特色
視頻教學:提供近15小時(共84段)配套教學視頻,幫助讀者提高學習效率。
內容全面:涵蓋MySQL從基礎、開發、優化,到運維和架構等方方面面的知識點。
講解深入:從MySQL數據庫的基礎操作,到優化、運維與架構,層層深入。
實用性強:結合大量經典示例和實戰案例展開講解,帶領讀者動手實踐。
配套資源獲取方式
本書涉及的源代碼及案例工程文件需要讀者自行下載,請按照前言中的詳細說明進行獲取。
目錄大綱
前言
第1篇 MySQL基礎
第1章 數據庫概述 2
1.1 數據庫的定義 2
1.1.1 數據庫 2
1.1.2 數據庫管理系統 2
1.1.3 數據表 3
1.1.4 數據類型 3
1.1.5 運算符 4
1.1.6 函數 4
1.1.7 主鍵 4
1.1.8 外鍵 4
1.1.9 索引 6
1.1.10 視圖 6
1.1.11 存儲過程 6
1.1.12 觸發器 6
1.1.13 存儲引擎 7
1.2 數據庫的發展 7
1.2.1 人工管理階段 7
1.2.2 文件系統階段 7
1.2.3 數據庫系統階段 8
1.2.4 雲數據庫階段 8
1.3 本章總結 8
第2章 數據庫技術 9
2.1 數據庫系統 9
2.2 SQL語言 11
2.2.1 SQL語言分類 11
2.2.2 ER圖 12
2.2.3 SQL執行流程 14
2.3 數據庫訪問技術 15
2.4 本章總結 16
第3章 MySQL數據庫 17
3.1 MySQL三大範式 17
3.1.1 第一範式 17
3.1.2 第二範式 18
3.1.3 第三範式 19
3.1.4 反範式化 19
3.2 MySQL存儲引擎 20
3.2.1 查看MySQL中的存儲引擎 20
3.2.2 常用存儲引擎介紹 21
3.3 本章總結 23
第2篇 環境搭建
第4章 安裝三大操作系統 26
4.1 安裝VMware虛擬機 26
4.1.1 下載VMware虛擬機 26
4.1.2 安裝VMware虛擬機步驟 30
4.2 安裝Windows操作系統 31
4.2.1 下載Windows操作系統 31
4.2.2 設置VMware虛擬機 33
4.2.3 安裝Windows操作系統步驟 38
4.3 安裝Mac OS X操作系統 44
4.3.1 設置VMware虛擬機 45
4.3.2 安裝Mac OS X操作系統步驟 46
4.4 安裝CentOS操作系統 55
4.4.1 下載CentOS操作系統 55
4.4.2 設置VMware虛擬機 56
4.4.3 安裝CentOS操作系統步驟 56
4.5 本章總結 65
第5章 服務器基礎配置 66
5.1 配置CentOS 6.8服務器環境 66
5.1.1 修改主機名 66
5.1.2 配置靜態IP地址 69
5.1.3 配置主機名和IP地址的映射關系 71
5.1.4 配置防火牆規則 71
5.1.5 配置root用戶SSH免密碼登錄 73
5.2 添加mysql用戶身份 75
5.2.1 添加mysql用戶組和用戶 75
5.2.2 賦予mysql用戶目錄權限 75
5.2.3 賦予mysql用戶sudo權限 76
5.2.4 賦予mysql用戶登錄密碼 76
5.2.5 配置mysql用戶SSH免密碼登錄 76
5.3 本章總結 77
第6章 搭建MySQL環境 78
6.1 基於MSI文件安裝Windows版本的MySQL 78
6.1.1 下載MySQL的MSI安裝包 78
6.1.2 基於MSI文件安裝MySQL 80
6.1.3 配置MySQL系統環境變量 90
6.1.4 測試MySQL 92
6.2 基於ZIP文件安裝Windows版本的MySQL 92
6.2.1 下載MySQL的ZIP安裝包 92
6.2.2 基於ZIP文件安裝MySQL 94
6.2.3 配置MySQL系統環境變量 96
6.2.4 測試MySQL 97
6.3 基於DMG文件安裝Mac OS X版本的MySQL 98
6.3.1 下載MySQL的DMG安裝包 98
6.3.2 基於DMG文件安裝MySQL 100
6.3.3 配置MySQL系統環境變量 102
6.3.4 測試MySQL 104
6.4 基於GZ文件安裝Mac OS X版本的MySQL 105
6.4.1 下載MySQL的GZ安裝包 105
6.4.2 基於GZ文件安裝MySQL 105
6.4.3 配置MySQL系統環境變量 107
6.4.4 測試MySQL 107
6.5 基於RPM文件安裝CentOS版本的MySQL 109
6.5.1 刪除CentOS 6.8服務器自帶的MySQL 109
6.5.2 下載MySQL的RPM安裝包 110
6.5.3 基於RPM文件安裝MySQL 111
6.5.4 測試MySQL 113
6.6 基於源碼安裝CentOS版本的MySQL 114
6.6.1 環境準備 115
6.6.2 下載軟件包 116
6.6.3 升級gcc和cmake 117
6.6.4 編譯安裝MySQL源碼 119
6.6.5 配置MySQL 120
6.6.6 初始化並啟動MySQL服務 123
6.6.7 測試MySQL 123
6.6.8 編譯安裝MySQL的boost源碼 124
6.7 遇到的問題和解決方案 125
6.8 本章總結 126
第3篇 MySQL開發
第7章 MySQL操作數據庫 128
7.1 創建數據庫 128
7.1.1 使用CREATE DATABASE語句創建數據庫 128
7.1.2 使用CREATE DATABASE IF NOT EXISTS語句創建數據庫 129
7.2 查看數據庫 130
7.2.1 查看MySQL中存在的數據庫 130
7.2.2 查看MySQL命令行所在的數據庫 131
7.2.3 查看數據庫的創建信息 131
7.3 修改數據庫名稱 132
7.3.1 通過重命名數據表修改數據庫名稱 132
7.3.2 通過導入/導出數據修改數據庫名稱 133
7.3.3 通過創建數據表修改數據庫名稱 134
7.4 數據庫編碼 135
7.4.1 創建數據庫時指定字符編碼 135
7.4.2 修改數據庫的字符編碼 136
7.5 刪除數據庫 136
7.6 本章總結 137
第8章 MySQL操作數據表 138
8.1 創建數據表 138
8.1.1 創建空數據表 138
8.1.2 創建數據表時指定主鍵 141
8.1.3 創建數據表時指定外鍵 142
8.1.4 創建數據表時指定字段非空 144
8.1.5 創建數據表時指定默認值 144
8.1.6 創建數據表時指定主鍵默認遞增 145
8.1.7 創建數據表時指定存儲引擎 146
8.1.8 創建數據表時指定編碼 146
8.2 查看數據表結構 147
8.2.1 使用DESCRIBE/DESC語句查看表結構 147
8.2.2 使用SHOW CREATE TABLE語句查看表結構 148
8.3 修改數據表 149
8.3.1 修改數據表名稱 150
8.3.2 添加字段 150
8.3.3 添加字段時指定位置 151
8.3.4 修改字段名稱 153
8.3.5 修改字段的數據類型 154
8.3.6 修改字段的位置 154
8.3.7 刪除字段 156
8.3.8 修改已有表的存儲引擎 157
8.3.9 取消數據表的外鍵約束 158
8.4 刪除數據表 158
8.4.1 刪除沒有關聯關系的數據表 158
8.4.2 刪除有外鍵約束的主表 160
8.5 MySQL中的臨時表 160
8.5.1 創建臨時表 161
8.5.2 刪除臨時表 161
8.6 本章總結 162
第9章 MySQL數據類型 163
9.1 數值類型 163
9.1.1 整數類型 163
9.1.2 浮點數類型 168
9.1.3 定點數類型 171
9.2 日期和時間類型 173
9.2.1 YEAR類型 174
9.2.2 TIME類型 176
9.2.3 DATE類型 178
9.2.4 DATETIME類型 181
9.2.5 TIMESTAMP類型 183
9.3 文本字符串類型 186
9.3.1 文本字符串類型概述 186
9.3.2 CHAR與VARCHAR類型 187
9.3.3 TEXT類型 188
9.3.4 ENUM類型 189
9.3.5 SET類型 191
9.3.6 JSON類型 192
9.4 二進制字符串類型 193
9.4.1 二進制字符串類型概述 193
9.4.2 BIT類型 194
9.4.3 BINARY與VARBINARY類型 195
9.4.4 BLOB類型 196
9.5 本章總結 196
第10章 MySQL運算符 197
10.1 算術運算符 197
10.1.1 MySQL支持的算術運算符 197
10.1.2 算術運算符簡單示例 198
10.2 比較運算符 199
10.2.1 MySQL支持的比較運算符 199
10.2.2 比較運算符簡單示例 201
10.3 邏輯運算符 206
10.3.1 MySQL支持的邏輯運算符 206
10.3.2 邏輯運算符簡單示例 206
10.4 位運算符 208
10.4.1 MySQL支持的位運算符 208
10.4.2 位運算符簡單示例 208
10.5 運算符的優先級 210
10.6 本章總結 211
第11章 MySQL函數 212
11.1 MySQL函數簡介 212
11.2 數學函數 213
11.2.1 絕對值函數 213
11.2.2 圓周率函數 213
11.2.3 獲取整數的函數 213
11.2.4 返回列表中的最大值與最小值函數 214
11.2.5 角度與弧度互換函數 215
11.2.6 三角函數 215
11.2.7 乘方與開方函數 217
11.2.8 對數函數 218
11.2.9 隨機函數 219
11.2.10 四捨五入與數字截取函數 220
11.2.11 符號函數 221
11.2.12 數學運算函數 221
11.3 字符串函數 222
11.3.1 ASCII(S)函數 222
11.3.2 CHAR_LENGTH(S)函數 222
11.3.3 LENGTH(S)函數 223
11.3.4 CONCAT(S1,S2,…,Sn)函數 223
11.3.5 CONCAT_WS(X, S1,S2,…,Sn)函數 223
11.3.6 INSERT(oldstr, x, y, replacestr)函數 224
11.3.7 LOWER(S)函數 224
11.3.8 UPPER(S)函數 225
11.3.9 LEFT(str, x)函數 225
11.3.10 RIGHT(str, x)函數 225
11.3.11 LPAD(str, n pstr)函數 226
11.3.12 RPAD(str, n, pstr)函數 226
11.3.13 LTRIM(S)函數 226
11.3.14 RTRIM(S)函數 226
11.3.15 TRIM(S)函數 227
11.3.16 TRIM(substr FROM str)函數 227
11.3.17 REPEAT(str, x)函數 227
11.3.18 REPLACE(S,A,B)函數 227
11.3.19 STRCMP(S1, S2)函數 228
11.3.20 SUBSTR(S, X, Y)函數 228
11.3.21 MID(S, X, Y)函數 228
11.3.22 SPACE(X)函數 229
11.3.23 LOCATE(substr, str)函數 229
11.3.24 ELT(M, S1, S2, …, Sn)函數 230
11.3.25 FIELD(S,S1,S2,…,Sn)函數 230
11.3.26 FIND_IN_SET(S1, S2)函數 230
11.3.27 REVERSE(S)函數 231
11.3.28 NULLIF(value1, value2)函數 231
11.4 日期和時間函數 231
11.4.1 CURDATE()函數 232
11.4.2 CURTIME()函數 232
11.4.3 NOW()函數 232
11.4.4 UNIX_TIMESTAMP(date)函數 233
11.4.5 FROM_UNIXTIME(timestamp)函數 233
11.4.6 UTC_DATE()函數 233
11.4.7 UTC_TIME()函數 234
11.4.8 YEAR(date)函數 234
11.4.9 MONTH(date)函數 234
11.4.10 MONTHNAME(date)函數 235
11.4.11 DAY(date)函數 235
11.4.12 DAYNAME(date)函數 235
11.4.13 DAYOFWEEK(date)函數 235
11.4.14 WEEKDAY(date)函數 236
11.4.15 WEEK(date)函數 236
11.4.16 WEEKOFYEAR(date)函數 236
11.4.17 DAYOFYEAR(date)函數 237
11.4.18 DAYOFMONTH(date)函數 237
11.4.19 QUARTER(date)函數 237
11.4.20 HOUR(time)函數 237
11.4.21 MINUTE(time)函數 238
11.4.22 SECOND(time)函數 238
11.4.23 EXTRACT(type FROM date)函數 238
11.4.24 TIME_TO_SEC(time)函數 239
11.4.25 SEC_TO_TIME(seconds)函數 240
11.4.26 DATE_ADD(date, INTERVAL expr type)函數 240
11.4.27 DATE_SUB(date, INTERVAL expr type)函數 241
11.4.28 ADDTIME(time1, time2)函數 241
11.4.29 SUBTIME(time1, time2)函數 242
11.4.30 DATEDIFF(date1, date2)函數 242
11.4.31 FROM_DAYS(N)函數 242
11.4.32 LAST_DAY(date)函數 243
11.4.33 MAKEDATE(year, n)函數 243
11.4.34 MAKETIME(hour, minute, second)函數 243
11.4.35 PERIOD_ADD(time, n)函數 244
11.4.36 TO_DAYS(date)函數 244
11.4.37 DATE_FORMAT(date, format)函數 244
11.4.38 TIME_FORMAT(time, format)函數 245
11.4.39 GET_FORMAT(date_type, format_type)函數 246
11.4.40 STR_TO_DATE(str, format)函數 246
11.5 流程處理函數 247
11.5.1 IF(value, value1,value2)函數 247
11.5.2 IFNULL(value1, value2)函數 247
11.5.3 CASE WHEN THEN函數 247
11.5.4 CASE expr WHEN函數 248
11.6 加密與解密函數 248
11.6.1 PASSWORD(value)函數 249
11.6.2 MD5(value)函數 249
11.6.3 ENCODE(value, password_seed)函數 249
11.6.4 DECODE(value, password_seed)函數 249
11.7 聚合函數 250
11.7.1 COUNT(/字段名稱)函數 250
11.7.2 MAX(字段名稱)函數 251
11.7.3 MIN(字段名稱)函數 251
11.7.4 SUM(字段名稱)函數 251
11.7.5 AVG(字段名稱)函數 251
11.8 獲取MySQL信息函數 252
11.8.1 VERSION()函數 252
11.8.2 CONNECTION_ID()函數 252
11.8.3 DATABASE()函數 252
11.8.4 USER()函數 253
11.8.5 LAST_INSERT_ID()函數 253
11.8.6 CHARSET(value)函數 254
11.8.7 COLLATION(value)函數 254
11.9 加鎖與解鎖函數 254
11.9.1 GET_LOCK(value, timeout)函數 254
11.9.2 RELEASE_LOCK(value)函數 255
11.9.3 IS_FREE_LOCK(value)函數 255
11.9.4 IS_USED_LOCK(value)函數 255
11.10 JSON函數 256
11.10.1 JSON_CONTAINS(json_doc, value)函數 256
11.10.2 JSON_SEARCH(json_doc ->> '$[].key', type, value)函數 257
11.10.3 JSON_PRETTY(json_doc)函數 257
11.10.4 JSON_DEPTH(json_doc)函數 257
11.10.5 JSON_LENGTH(json_doc[, path])函數 258
11.10.6 JSON_KEYS(json_doc[, path])函數 258
11.10.7 JSON_INSERT(json_doc, path, val[, path, val] ...)函數 258
11.10.8 JSON_REMOVE(json_doc, path[, path] ...)函數 259
11.10.9 JSON_REPLACE(json_doc, path, val[, path, val] ...)函數 259
11.10.10 JSON_SET(json_doc, path, val[, path, val] ...)函數 260
11.10.11 JSON_TYPE(json_val)函數 261
11.10.12 JSON_VALID(value)函數 261
11.11 窗口函數 261
11.11.1 序號函數 263
11.11.2 分佈函數 264
11.11.3 前後函數 265
11.11.4 首尾函數 267
11.11.5 其他函數 268
11.12 MySQL的其他函數 269
11.12.1 FORMAT(value, n)函數 269
11.12.2 CONV(value, from, to)函數 269
11.12.3 INET_ATON(value)函數 270
11.12.4 INET_NTOA(value)函數 270
11.12.5 BENCHMARK(n, expr)函數 270
11.12.6 CAST(value AS type)函數 271
11.12.7 CONVERT(value USING char_code)函數 271
11.13 本章總結 272
第12章 MySQL數據變更 273
12.1 數據插入 273
12.1.1 數據插入規則 273
12.1.2 插入完整的行記錄 274
12.1.3 指定字段插入數據 275
12.1.4 一次插入多條數據記錄 276
12.1.5 將查詢結果插入另一個表中 278
12.2 數據更新 280
12.2.1 更新數據表中的所有記錄 281
12.2.2 更新表中特定的數據行 281
12.2.3 更新某個範圍內的數據 282
12.2.4 更新符合正則表達式的數據 285
12.3 數據刪除 286
12.3.1 刪除數據表中特定的數據 286
12.3.2 刪除某個範圍內的數據 286
12.3.3 刪除符合正則表達式的數據 289
12.3.4 刪除數據表中的所有數據 289
12.4 本章總結 289
第13章 MySQL數據查詢 290
13.1 數據準備 290
13.2 SELECT查詢語句 291
13.2.1 查詢表中所有字段的數據 291
13.2.2 查詢表中單個字段的數據 293
13.2.3 查詢表中指定字段的數據 294
13.2.4 使用完全限定字段名查詢數據 294
13.2.5 使用完全限定表名查詢數據 295
13.3 WHERE條件語句 296
13.3.1 WHERE語句語法格式 296
13.3.2 查詢單一的特定數據 296
13.3.3 查詢某個範圍內的數據 297
13.3.4 IN和NOT IN條件語句 297
13.3.5 BETWEEN AND條件語句 298
13.3.6 LIKE條件語句 299
13.3.7 空值條件限制語句 300
13.3.8 AND語句 302
13.3.9 OR語句 303
13.3.10 DISTINCT語句 303
13.3.11 ORDER BY語句 304
13.3.12 GROUP BY語句 306
13.3.13 HAVING語句 308
13.3.14 WITH ROLLUP語句 308
13.3.15 對數據同時進行分組與排序 308
13.3.16 LIMIT語句 309
13.4 數據聚合查詢 310
13.4.1 查詢數據的總行數 310
13.4.2 查詢某列數據的總和 311
13.4.3 查詢某列數據的最小值 312
13.4.4 查詢某列數據的最大值 312
13.4.5 查詢某列數據的平均值 313
13.5 JOIN語句 314
13.5.1 INNER JOIN語句 314
13.5.2 LEFT JOIN語句 315
13.5.3 RIGHT JOIN語句 316
13.5.4 CROSS JOIN 語句 317
13.5.5 使用復合連接條件查詢數據 317
13.6 子查詢語句 318
13.6.1 ANY子查詢 318
13.6.2 ALL子查詢 319
13.6.3 EXISTS子查詢 319
13.6.4 NOT EXISTS子查詢 320
13.6.5 IN子查詢 320
13.6.6 NOT IN子查詢 321
13.6.7 子查詢作為結果字段 321
13.7 UNION聯合語句 322
13.7.1 UNION語句 322
13.7.2 UNION ALL語句 323
13.8 使用別名查詢數據 323
13.8.1 為字段名指定別名 323
13.8.2 為表名指定別名 324
13.8.3 同時為字段名和表名指定別名 325
13.9 使用正則表達式查詢數據 325
13.10 本章總結 326
第14章 MySQL索引 327
14.1 索引簡介 327
14.1.1 MySQL遍歷表的方式 327
14.1.2 索引的優點與缺點 328
14.1.3 索引的創建原則 328
14.2 索引的使用場景 329
14.2.1 適合創建索引的場景 329
14.2.2 不適合創建索引的場景 330
14.3 創建數據表時創建索引 330
14.3.1 語法格式 330
14.3.2 創建普通索引 331
14.3.3 創建唯一索引 332
14.3.4 創建主鍵索引 333
14.3.5 創建單列索引 333
14.3.6 創建組合索引 334
14.3.7 創建全文索引 337
14.3.8 創建空間索引 338
14.4 為已有數據表添加索引 338
14.4.1 語法格式 339
14.4.2 創建普通索引 339
14.4.3 創建唯一索引 340
14.4.4 創建主鍵索引 341
14.4.5 創建單列索引 342
14.4.6 創建組合索引 343
14.4.7 創建全文索引 344
14.4.8 創建空間索引 345
14.5 刪除索引 347
14.5.1 語法格式 347
14.5.2 刪除索引方式 347
14.6 隱藏索引 348
14.6.1 隱藏索引概述 349
14.6.2 語法格式 349
14.6.3 創建測試表 349
14.6.4 索引操作 350
14.7 降序索引 355
14.7.1 降序索引概述 355
14.7.2 降序索引操作 355
14.8 函數索引 359
14.8.1 函數索引概述 359
14.8.2 函數索引操作 359
14.9 本章總結 363
第15章 MySQL視圖 364
15.1 視圖概述 364
15.1.1 視圖的概念 364
15.1.2 視圖的優點 364
15.2 創建視圖 365
15.2.1 語法格式 365
15.2.2 創建單表視圖 366
15.2.3 創建多表聯合視圖 369
15.3 查看視圖 370
15.3.1 使用SHOW TABLES語句查看視圖 370
15.3.2 使用DESCRIBE/DESC語句查看視圖 371
15.3.3 使用SHOW TABLE STATUS語句查看視圖 371
15.3.4 使用SHOW CREATE VIEW語句查看視圖 373
15.3.5 查看views數據表中的視圖信息 373
15.4 修改視圖的結構 374
15.4.1 使用CREATE OR REPLACE VIEW語句修改視圖結構 374
15.4.2 使用ALTER語句修改視圖結構 375
15.5 更新視圖的數據 376
15.5.1 直接更新視圖數據 376
15.5.2 間接更新視圖數據 379
15.6 刪除視圖 381
15.7 本章總結 382
第16章 存儲過程和函數 383
16.1 存儲過程和函數簡介 383
16.1.1 什麽是存儲過程和函數 383
16.1.2 存儲過程和函數的使用場景 384
16.1.3 存儲過程和函數的優點 384
16.2 創建存儲過程和函數 386
16.2.1 創建存儲過程 386
16.2.2 創建存儲函數 388
16.3 查看存儲過程和函數 389
16.3.1 查看存儲過程和函數的創建或定義信息 389
16.3.2 查看存儲過程和函數的狀態信息 390
16.3.3 從數據庫中查看存儲過程和函數的信息 391
16.4 修改存儲過程和函數 394
16.4.1 修改存儲過程 394
16.4.2 修改存儲函數 395
16.5 調用存儲過程和函數 396
16.5.1 調用存儲過程 396
16.5.2 調用存儲函數 397
16.6 刪除存儲過程和函數 398
16.6.1 刪除存儲過程 398
16.6.2 刪除存儲函數 398
16.7 MySQL中使用變量 399
16.7.1 定義變量 399
16.7.2 變量賦值 400
16.8 MySQL中使用變量案例 401
16.8.1 在存儲過程中使用變量 401
16.8.2 在函數中使用變量 402
16.9 定義條件和處理程序 403
16.9.1 定義條件 403
16.9.2 定義處理程序 404
16.10 定義條件和處理程序案例 405
16.10.1 在存儲過程中未定義條件和處理程序 406
16.10.2 在存儲過程中定義條件和處理程序 407
16.10.3 在函數中未定義條件和處理程序 408
16.10.4 在函數中定義條件和處理程序 409
16.11 MySQL中游標的使用 410
16.11.1 聲明游標 410
16.11.2 打開游標 410
16.11.3 使用游標 411
16.11.4 關閉游標 411
16.12 MySQL中游標的使用案例 412
16.12.1 在存儲過程中使用游標 412
16.12.2 在函數中使用游標 413
16.13 MySQL中控制流程的使用 414
16.13.1 使用IF語句控制流程 414
16.13.2 使用CASE語句控制流程 415
16.13.3 使用LOOP語句控制流程 417
16.13.4 使用LEAVE語句控制流程 418
16.13.5 使用ITERATE語句控制流程 418
16.13.6 使用REPEAT語句控制流程 419
16.13.7 使用WHILE語句控制流程 420
16.14 本章總結 421
第17章 MySQL觸發器 422
17.1 創建觸發器 422
17.1.1 語法格式 422
17.1.2 創建觸發器示例 423
17.2 查看觸發器 425
17.2.1 使用SHOW TRIGGERS語句查看觸發器的信息 425
17.2.2 使用SHOW CREATE TRIGGER語句查看觸發器的信息 426
17.2.3 通過查看triggers數據表中的數據查看觸發器的信息 427
17.3 刪除觸發器 429
17.3.1 語法格式 429
17.3.2 刪除觸發器示例 429
17.4 本章小結 429
第18章 MySQL分區 430
18.1 分區介紹 430
18.1.1 不同版本MySQL的分區 430
18.1.2 分區的優勢 432
18.1.3 分區類型 433
18.2 RANGE分區 434
18.2.1 創建分區表 434
18.2.2 添加分區 437
18.2.3 刪除分區 438
18.2.4 重定義分區 440
18.3 LIST分區 442
18.3.1 創建分區表 442
18.3.2 添加分區 443
18.3.3 刪除分區 444
18.3.4 重定義分區 444
18.4 COLUMNS分區 445
18.4.1 RANGE COLUMNS分區 446
18.4.2 LIST COLUMNS分區 447
18.5 HASH分區 448
18.5.1 創建分區表 448
18.5.2 添加分區 449
18.5.3 合並分區 450
18.6 KEY分區 451
18.7 子分區 452
18.8 分區中的NULL值處理 452
18.8.1 RANGE分區中的NULL值 452
18.8.2 LIST分區中的NULL值 453
18.8.3 HASH分區與KEY分區中的NULL值 454
18.9 本章總結 455
第19章 MySQL公用表表達式和生成列 456
19.1 公用表表達式 456
19.1.1 非遞歸CTE 456
19.1.2 遞歸CTE 457
19.1.3 遞歸CTE的限制 459
19.2 生成列 461
19.2.1 創建表時指定生成列 462
19.2.2 為已有表添加生成列 463
19.2.3 修改已有的生成列 464
19.2.4 刪除生成列 464
19.3 本章總結 465
第4篇 MySQL優化
第20章 MySQL查詢優化 468
20.1 SHOW STATUS語句解析 468
20.2 EXPLAIN語句解析 469
20.3 SHOW PROFILE語句解析 477
20.3.1 分析InnoDB數據表 478
20.3.2 分析MyISAM數據表 480
20.3.3 分析MySQL源碼 481
20.4 pt-query-digest分析查詢 482
20.5 優化子查詢 483
20.6 本章總結 483
第21章 MySQL索引優化 484
21.1 索引的類型 484
21.2 使用索引的場景 485
21.2.1 全值匹配 485
21.2.2 查詢範圍 486
21.2.3 匹配最左前綴 486
21.2.4 查詢索引列 487
21.2.5 匹配字段前綴 487
21.2.6 精確與範圍匹配索引 488
21.2.7 匹配NULL值 488
21.2.8 連接查詢匹配索引 489
21.2.9 LIKE匹配索引 490
21.3 無法使用索引的場景 490
21.3.1 以通配符開始的LIKE語句 490
21.3.2 數據類型轉換 491
21.3.3 聯合索引未匹配最左列 491
21.3.4 OR語句 492
21.3.5 計算索引列 492
21.3.6 範圍條件右側的列無法使用索引 493
21.3.7 使用<>或!=操作符匹配查詢條件 493
21.3.8 匹配NOT NULL值 493
21.3.9 索引耗時 494
21.4 使用索引提示 494
21.4.1 使用索引 494
21.4.2 忽略索引 495
21.4.3 強制使用索引 495
21.5 使用生成列為JSON建立索引 496
21.6 本章總結 497
第22章 SQL語句優化 498
22.1 嵌套查詢的優化 498
22.2 OR條件語句的優化 500
22.3 ORDER BY語句的優化 501
22.4 GROUP BY語句的優化 502
22.5 分頁查詢的優化 503
22.5.1 回表查詢優化分頁 503
22.5.2 記錄數據標識優化分頁 504
22.6 插入數據的優化 505
22.6.1 MyISAM數據表插入數據的優化 505
22.6.2 InnoDB數據表插入數據的優化 506
22.7 刪除數據的優化 506
22.8 本章總結 507
第23章 數據庫優化 508
23.1 優化數據類型 508
23.1.1 使用數據類型的基本原則 508
23.1.2 優化表中的數據類型 509
23.2 刪除重復索引和冗餘索引 511
23.2.1 創建測試索引 511
23.2.2 使用pt-duplicate-key-checker刪除重復索引和冗餘索引 511
23.2.3 使用mysqlindexcheck刪除重復索引和冗餘索引 513
23.3 反範式化設計 514
23.4 增加中間表 515
23.5 分析數據表 517
23.6 檢查數據表 518
23.7 優化數據表 518
23.8 拆分數據表 519
23.8.1 垂直拆分數據表 519
23.8.2 水平拆分數據表 520
23.9 本章總結 520
第24章 MySQL服務器優化 521
24.1 MySQL服務器硬件的優化 521
24.1.1 優化硬件配置 521
24.1.2 系統內核優化 522
24.2 MySQL配置項的優化 523
24.3 本章總結 524
第25章 應用程序優化 525
25.1 復用數據庫連接 525
25.2 減少數據訪問 526
25.3 開啟查詢緩存 527
25.4 使用外部緩存 528
25.5 使用分佈式MySQL架構 529
25.6 本章總結 529
第26章 MySQL的其他優化選項 530
26.1 使用performance_schema數據庫分析MySQL 530
26.1.1 查看MySQL是否支持performance_schema 530
26.1.2 開啟或關閉performance_schema 532
26.1.3 performance_schema的簡單配置與使用 532
26.2 使用sys數據庫分析MySQL 535
26.2.1 sys數據庫概述 535
26.2.2 sys數據庫的常用查詢 535
26.3 MySQL 8.x中的資源組 538
26.3.1 開啟 CAP_SYS_NICE 538
26.3.2 創建資源組 539
26.3.3 查看資源組 540
26.3.4 綁定資源組 540
26.3.5 修改資源組 542
26.3.6 開啟與禁用資源組 542
26.3.7 刪除資源組 543
26.4 本章總結 544
第5篇 MySQL運維
第27章 MySQL命令行工具 546
27.1 查看MySQL命令 546
27.2 mysql命令 547
27.2.1 登錄MySQL終端 547
27.2.2 設置客戶端連接編碼 549
27.2.3 直接執行SQL語句 550
27.2.4 格式化輸出結果 550
27.2.5 SQL報錯處理 551
27.3 mysqladmin命令 552
27.3.1 mysqladmin命令參數 553
27.3.2 mysqladmin命令簡單示例 553
27.4 myisampack命令 554
27.5 mysqlbinlog命令 555
27.6 mysqlcheck命令 558
27.7 mysqlshow命令 559
27.8 mysqldump命令 561
27.9 mysqlimport命令 563
27.10 本章總結 564
第28章 MySQL日誌 565
28.1 查詢日誌 565
28.1.1 開啟查詢日誌 565
28.1.2 查看查詢日誌 566
28.1.3 刪除查詢日誌 567
28.1.4 關閉查詢日誌 568
28.2 慢查詢日誌 568
28.2.1 開啟慢查詢日誌 568
28.2.2 查看慢查詢日誌 569
28.2.3 刪除慢查詢日誌 570
28.2.4 關閉慢查詢日誌 571
28.3 錯誤日誌 571
28.3.1 開啟錯誤日誌 571
28.3.2 查看錯誤日誌 572
28.3.3 刪除錯誤日誌 572
28.3.4 關閉錯誤日誌 573
28.4 二進制日誌 573
28.4.1 開啟二進制日誌 573
28.4.2 查看二進制日誌 574
28.4.3 刪除二進制日誌 575
28.4.4 暫時停止與開啟二進制日誌 577
28.4.5 關閉二進制日誌 577
28.5 本章總結 577
第29章 數據備份與恢復 578
29.1 基於mysqldump備份並恢復數據 578
29.1.1 備份數據 578
29.1.2 恢復數據 581
29.2 基於mysqlpump備份並恢復數據 582
29.3 基於mydumper備份並恢復數據 583
29.3.1 安裝mydumper 583
29.3.2 備份數據 584
29.3.3 恢復數據 588
29.4 基於mysqlhotcopy備份並恢復數據 589
29.4.1 安裝mysqlhotcopy 589
29.4.2 備份數據 590
29.4.3 恢復數據 590
29.5 基於xtrabackup備份並恢復數據 590
29.5.1 安裝xtrabackup 590
29.5.2 備份數據 591
29.5.3 恢復準備 593
29.5.4 恢復數據 594
29.6 數據備份與恢復案例 596
29.6.1 完全恢復數據案例 596
29.6.2 基於位置點恢復數據案例 598
29.6.3 基於時間點恢復數據案例 598
29.7 MySQL災難恢復 598
29.7.1 問題重現 599
29.7.2 問題分析 599
29.7.3 問題解決 600
29.8 實現數據庫的自動備份 602
29.9 導出數據 603
29.9.1 使用SELECT INTO OUTFILE語句導出數據 603
29.9.2 使用mysqldump命令導出數據 605
29.9.3 使用mysql命令導出數據 606
29.10 導入數據 607
29.10.1 使用LOAD DATA INFILE導入數據 608
29.10.2 使用mysqlimport導入數據 609
29.11 遇到的問題和解決方案 610
29.12 本章總結 611
第30章 MySQL賬戶管理 612
30.1 MySQL中的權限表 612
30.2 創建普通用戶 613
30.2.1 使用CREATE USER語句創建用戶 613
30.2.2 使用GRANT語句創建用戶 617
30.2.3 操作user數據表創建用戶 619
30.3 為用戶授權 620
30.3.1 權限層級 620
30.3.2 使用GRANT語句為用戶授權 621
30.3.3 通過操作權限表為用戶授權 624
30.4 查看用戶權限 624
30.4.1 通過SHOW GRANTS FOR語句查看用戶權限 624
30.4.2 通過查詢mysql.user數據表查看用戶權限 625
30.4.3 通過查詢information_schema數據庫查看用戶權限 625
30.5 修改用戶權限 626
30.5.1 使用GRANT語句修改用戶權限 626
30.5.2 通過操作數據表修改用戶權限 627
30.6 撤銷用戶權限 628
30.6.1 使用REVOKE語句撤銷用戶權限 628
30.6.2 通過操作數據表撤銷用戶權限 629
30.7 修改用戶密碼 630
30.7.1 通過mysqladmin修改用戶密碼 630
30.7.2 使用SET PASSWORD語句修改用戶密碼 630
30.7.3 使用GRANT語句修改用戶密碼 631
30.7.4 通過操作user數據表修改用戶密碼 632
30.7.5 忘記root密碼的解決方案 632
30.8 刪除用戶 633
30.8.1 使用DROP USER語句刪除用戶 633
30.8.2 使用DELETE語句刪除用戶 634
30.9 限制用戶使用資源 634
30.9.1 限制用戶使用資源示例 634
30.9.2 修改用戶的資源限制 635
30.9.3 解除用戶的資源限制 635
30.10 MySQL 8.x版本中的賬戶管理 636
30.10.1 用戶創建和授權 636
30.10.2 認證插件更新 636
30.10.3 密碼管理 638
30.10.4 角色管理 640
30.11 本章總結 644
第6篇 MySQL架構
第31章 MySQL復制 646
31.1 搭建MySQL主從復制環境 646
31.1.1 服務器規劃 646
31.1.2 搭建MySQL主從環境 647
31.1.3 測試MySQL主從復制環境 650
31.2 搭建MySQL主主復制環境 652
31.2.1 服務器規劃 652
31.2.2 將MySQL主從環境切換為主主環境 652
31.2.3 直接搭建MySQL主主環境 654
31.2.4 測試MySQL主主復制環境 654
31.3 添加MySQL從庫 655
31.3.1 服務器規劃 655
31.3.2 在主從服務器上進行的操作 656
31.3.3 測試MySQL主從復制環境 658
31.4 切換主從復制到鏈式復制 659
31.4.1 服務器規劃 659
31.4.2 切換復制模式 660
31.5 切換鏈式復制到主從復制 662
31.6 搭建MySQL多源復制環境 665
31.6.1 服務器規劃 665
31.6.2 搭建MySQL多源復制環境 666
31.6.3 測試MySQL多源復制環境 667
31.7 添加復制過濾器 668
31.7.1 復制指定的數據庫 669
31.7.2 忽略指定的數據庫 669
31.7.3 復制指定的數據表 670
31.7.4 忽略指定的數據表 670
31.8 設置延遲復制 671
31.9 基於GTID搭建MySQL主從復制環境 671
31.10 基於半同步模式搭建MySQL主從復制環境 673
31.10.1 半同步參數說明 673
31.10.2 配置半同步復制 674
31.10.3 測試半同步復制 676
31.11 本章總結 677
第32章 MySQL讀寫分離 678
32.1 基於MySQL Proxy實現讀寫分離 678
32.1.1 服務器規劃 678
32.1.2 安裝Lua環境 679
32.1.3 安裝MySQL Proxy 679
32.1.4 配置MySQL Proxy讀寫分離 680
32.1.5 啟動MySQL Proxy 683
32.1.6 測試MySQL Proxy的讀寫分離 683
32.2 基於Atlas實現讀寫分離 685
32.2.1 服務器規劃 685
32.2.2 安裝Atlas 685
32.2.3 配置Atlas讀寫分離 686
32.2.4 啟動Atlas 687
32.2.5 測試Atlas讀寫分離 689
32.3 基於ProxySQL實現讀寫分離 689
32.3.1 服務器規劃 689
32.3.2 安裝ProxySQL 690
32.3.3 配置ProxySQL讀寫分離 690
32.3.4 測試ProxySQL讀寫分離 695
32.4 基於Amoeba實現讀寫分離 695
32.4.1 服務器規劃 695
32.4.2 安裝JDK 695
32.4.3 安裝Amoeba 696
32.4.4 配置Amoeba讀寫分離 697
32.4.5 啟動Amoeba 699
32.4.6 測試Amoeba讀寫分離 700
32.5 基於Mycat實現讀寫分離 700
32.5.1 服務器規劃 701
32.5.2 安裝JDK 701
32.5.3 安裝Mycat 701
32.5.4 配置Mycat讀寫分離 702
32.5.5 啟動Mycat 703
32.5.6 測試Mycat讀寫分離 704
32.6 本章總結 704
第33章 MySQL HA高可用架構 705
33.1 基於Keepalived搭建MySQL高可用環境 705
33.1.1 服務器規劃 705
33.1.2 安裝Keepalived 706
33.1.3 配置MySQL高可用 707
33.1.4 測試MySQL高可用 710
33.1.5 自動重啟MySQL 711
33.2 基於HAProxy搭建Mycat高可用環境 713
33.2.1 服務器規劃 713
33.2.2 安裝Mycat狀態檢查服務 713
33.2.3 安裝HAProxy服務 715
33.2.4 配置Mycat負載均衡 716
33.2.5 測試Mycat高可用環境 719
33.3 基於Keepalived搭建HAProxy高可用環境 721
33.3.1 服務器規劃 721
33.3.2 安裝並配置HAProxy和Keepalived 721
33.3.3 配置HAProxy高可用性 722
33.3.4 測試HAProxy高可用性 725
33.4 本章總結 726
參考文獻 727
作者介紹
冰河
大數據架構師,編程專家,Mykit系列開源框架作者,
基於最終消息可靠性的開源分佈式事務框架mykit-transaction-message作者。
長期致力於分佈式系統架構、微服務架構、分佈式數據庫、
分佈式事務與大數據技術的研究,並主導過眾多相關項目的架構設計、研發和實施落地。
在高並發、高可用、高可擴展、高可維護和大數據等技術領域有豐富的實戰經驗。
對Hadoop、Storm、Spark和Flink等大數據框架的源碼做過深度分析。
目前致力於雲原生技術的研究。
運營“冰河技術”公眾號,著有《海量數據處理與大數據技術實戰》。