MySQL是流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。書(shū)中從數(shù)據(jù)設(shè)計(jì)和數(shù)據(jù)庫(kù)的基本使用開(kāi)始介紹,逐步深入一些復(fù)雜的內(nèi)容,包括連接查詢的使用、子查詢、字符串函數(shù)、數(shù)字函數(shù)、日期函數(shù)以及新版本的窗口函數(shù),還包括存儲(chǔ)過(guò)程、游標(biāo)、創(chuàng)建高效的索引以及SQL優(yōu)化技巧等。通過(guò)大量的示例應(yīng)用,系統(tǒng)地講述讀者應(yīng)該掌握的知識(shí),以及對(duì)于數(shù)據(jù)庫(kù)的優(yōu)化,其中包括MySQL的架構(gòu)以及MySQL 8的新特征,也包含MySQL基準(zhǔn)測(cè)試和性能剖析,數(shù)據(jù)庫(kù)軟硬件性能優(yōu)化,內(nèi)存優(yōu)化,復(fù)制、備份和恢復(fù),高可用與高可擴(kuò)展性,尤其對(duì)于MySQL中各種鎖機(jī)制以及MySQL的MVCC的核心原理都一一通過(guò)理論和大量的示例進(jìn)行解析,以方便讀者理解。
前言
第1章 MySQL入門和容器化部署 1
1.1 MySQL介紹 1
1.2 MySQL 8安裝和升級(jí) 2
1.2.1 安裝前說(shuō)明 2
1.2.2 在Windows上安裝MySQL 2
1.2.3 在Linux上安裝MySQL 8
1.2.4 在Docker上安裝MySQL 12
第2章 什么樣的數(shù)據(jù)庫(kù)設(shè)計(jì)才是優(yōu)秀的 17
2.1 關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)理論 17
2.2 連接數(shù)據(jù)庫(kù)和基本信息查詢 21
2.2.1 連接數(shù)據(jù)庫(kù) 21
2.2.2 基本信息查詢 21
2.3 數(shù)據(jù)庫(kù)和表 25
2.3.1 創(chuàng)建數(shù)據(jù)庫(kù) 26
2.3.2 創(chuàng)建表 27
2.4 數(shù)據(jù)類型和類型異常處理 28
2.4.1 數(shù)字?jǐn)?shù)據(jù)類型 28
2.4.2 日期和時(shí)間數(shù)據(jù)類型 32
2.4.3 字符串?dāng)?shù)據(jù)類型 33
2.4.4 JSON數(shù)據(jù)類型 39
第3章 SQL語(yǔ)句全面解析和應(yīng)用實(shí)戰(zhàn) 44
3.1 數(shù)據(jù)庫(kù)操作 44
3.2 數(shù)據(jù)表操作 46
3.2.1 創(chuàng)建數(shù)據(jù)表 46
3.2.2 數(shù)據(jù)表的修改與刪除 48
3.2.3 約束 49
3.3 數(shù)據(jù)查詢 50
3.4 數(shù)據(jù)插入 51
3.5 where(篩選) 52
3.6 and和or(與和或) 54
3.7 between(范圍查找) 55
3.8 distinct(去重關(guān)鍵字) 56
3.9 update(修改或更新) 56
3.10 delete(刪除) 58
3.11 like(模糊匹配) 59
3.12 order by(排序) 61
3.13 group by(分組) 62
3.14 with rollup(分組統(tǒng)計(jì)再統(tǒng)計(jì)) 63
3.15 having(分組篩選) 64
3.16 union和union all(組合查詢) 64
3.17 join(連接查詢) 67
3.17.1 inner join(內(nèi)連接) 68
3.17.2 left join(左連接) 69
3.17.3 right join(右連接) 70
3.18 in和not in(多關(guān)鍵字篩選) 71
3.19 exists和not exists(是否返回結(jié)果集) 72
3.20 復(fù)制表 73
3.21 臨時(shí)表 74
第4章 MySQL函數(shù)大全和高效率匯總統(tǒng)計(jì)實(shí)戰(zhàn) 76
4.1 MySQL字符串函數(shù) 76
4.1.1 character_length(s):返回字符串長(zhǎng)度 76
4.1.2 concat(s1,s2,(,sn):字符串合并 77
4.1.3 format(x,n):數(shù)字格式化 77
4.1.4 lpad(s1,len,s2):字符串填充 77
4.1.5 field(s,s1,s2,():返回字符串出現(xiàn)的位置 77
4.1.6 insert(s1,x,len,s2):替換字符串 78
4.1.7 lcase(s):把字符串中的所有字母轉(zhuǎn)換為小寫(xiě)字母 78
4.1.8 ucase(s):把字符串中的所有字母轉(zhuǎn)換為大寫(xiě)字母 78
4.1.9 strcmp(s1,s2):比較字符串大小 78
4.1.10 replace(s,s1,s2):字符串替換 79
4.1.11 position(s1 in s):獲取子字符串在字符串中出現(xiàn)的位置 79
4.1.12 md5(s):字符串加密 79
4.1.13 inet_aton(ip):把IP地址轉(zhuǎn)換為數(shù)字 80
4.1.14 inet_ntoa (s):把數(shù)字轉(zhuǎn)換為IP地址 80
4.2 MySQL數(shù)字函數(shù) 80
4.2.1 ceil(x):返回不小于x的最小整數(shù) 80
4.2.2 ceiling(x):返回不小于x的最小整數(shù) 80
4.2.3 floor(x):返回不大于x的最大整數(shù) 81
4.2.4 round(x):返回最接近x的整數(shù) 81
4.2.5 max(expression):求最大值 81
4.2.6 min(expression):求最小值 82
4.2.7 sum(expression):求總和 82
4.2.8 avg(expression):求平均值 83
4.2.9 count(expression):求總記錄數(shù) 83
4.3 MySQL日期函數(shù) 84
4.3.1 adddate(d,n):返回指定日期加上指定天數(shù)后的日期 84
4.3.2 addtime(t,n):返回指定時(shí)間加上指定時(shí)間后的時(shí)間 84
4.3.3 curdate():返回當(dāng)前日期 85
4.3.4 datediff(d1,d2):返回兩個(gè)日期相隔的天數(shù) 85
4.3.5 dayofyear(d):返回指定日期是本年的第幾天 85
4.3.6 extract(type from d):根據(jù)對(duì)應(yīng)格式返回日期 85
4.3.7 now():返回當(dāng)前日期和時(shí)間 86
4.3.8 quarter(d):返回日期對(duì)應(yīng)的季度數(shù) 87
4.3.9 second(t):返回指定時(shí)間中的秒數(shù) 87
4.3.10 timediff(time1, time2):計(jì)算時(shí)間差 87
4.3.11 date(t):從指定日期時(shí)間中提取日期值 88
4.3.12 hour(t):返回指定時(shí)間中的小時(shí)數(shù) 88
4.3.13 time(expression):提取日期時(shí)間參數(shù)中的時(shí)間部分 88
4.3.14 time_format(t,f):根據(jù)表達(dá)式顯示時(shí)間 88
4.3.15 year(d):返回指定日期的年份 89
4.4 MySQL高級(jí)函數(shù) 89
4.4.1 cast(x as type):數(shù)據(jù)類型轉(zhuǎn)換 89
4.4.2 coalesce(expr1, (, exprn):返回第一個(gè)非空表達(dá)式 89
4.4.3 if(expr,v1,v2):表達(dá)式判斷 90
4.4.4 ifnull(v1,v2):null替換 90
4.4.5 isnull(expression):判斷表達(dá)式是否為null 90
4.4.6 nullif(expr1, expr2):字符串相等則返回null 91
4.4.7 last_insert_id():返回最近生成的自增ID 91
4.4.8 case expression:表達(dá)式分支 92
4.5 MySQL over():窗口函數(shù)匯總分析 92
4.5.1 row _number():順序排名函數(shù) 94
4.5.2 rank():跳級(jí)排名函數(shù) 95
4.5.3 dense_rank():不跳級(jí)排名函數(shù) 96
4.5.4 lag(expr,n):前分析函數(shù),返回前n行的值 96
4.5.5 lead(expr,n):后分析函數(shù),返回后n行的值 98
4.5.6 first_value(expr):頭尾函數(shù),返回第一個(gè)值 98
4.5.7 last_value(expr):頭尾函數(shù),返回最后一個(gè)值 99
4.5.8 nth_value(expr,n):從結(jié)果集中的第n行獲取值 101
4.5.9 ntile(n):數(shù)據(jù)集分桶 102
4.5.10 sum() over(expr):聚合求和 103
4.5.11 avg() over(expr):聚合求平均值 104
4.5.12 max() over(expr):聚合求最大值 104
4.5.13 min() over(expr):聚合求最小值 105
4.5.14 count() over(expr):聚合總條數(shù) 105
第5章 MySQL大表快速優(yōu)化訣竅 107
5.1 分區(qū) 107
5.1.1 分區(qū)類型 108
5.1.2 范圍分區(qū) 108
5.1.3 列表分區(qū) 111
5.1.4 列分區(qū) 113
5.1.5 哈希分區(qū) 121
5.1.6 鍵分區(qū) 124
5.1.7 子分區(qū) 125
5.1.8 MySQL分區(qū)對(duì)null的處理 126
5.1.9 分區(qū)管理 132
5.1.10 分區(qū)的限制 138
5.2 視圖 142
5.3 存儲(chǔ)過(guò)程 145
5.3.1 存儲(chǔ)過(guò)程的創(chuàng)建和調(diào)用 145
5.3.2 帶參數(shù)的存儲(chǔ)過(guò)程 147
5.3.3 變量 150
5.3.4 注釋 151
5.3.5 存儲(chǔ)過(guò)程的修改和刪除 152
5.3.6 存儲(chǔ)過(guò)程的控制語(yǔ)句 152
5.4 游標(biāo) 154
5.5 字符集和排序規(guī)則 157
5.5.1 MySQL中的字符集和排序規(guī)則 157
5.5.2 列字符集和排序規(guī)則 160
5.5.3 使用collate指定查詢排序規(guī)則 160
第6章 MySQL創(chuàng)建高效的索引 162
6.1 索引 162
6.2 創(chuàng)建索引的指導(dǎo)原則 165
6.3 B-Tree索引和哈希索引的比較 166
6.4 高效SQL必備分析利器的執(zhí)行計(jì)劃分析 167
6.5 高效SQL的索引檢索原理 183
6.5.1 主鍵索引 183
6.5.2 普通索引 187
6.5.3 復(fù)合索引 189
6.6 索引的使用技巧與SQL優(yōu)化實(shí)戰(zhàn) 191
6.6.1 避免回表查詢 191
6.6.2 盡量使用聯(lián)合索引 191
6.6.3 索引條件下推優(yōu)化 192
6.6.4 避免全表掃描 192
6.6.5 負(fù)向查詢不能使用索引 192
6.6.6 前導(dǎo)模糊查詢不能使用索引 193
6.6.7 在字段上計(jì)算不能命中索引 193
6.6.8 查詢條件類型不一致不能命中索引 193
6.6.9 明確知道只返回一條記錄可以使用limit進(jìn)行限制 193
6.6.10 limit分頁(yè)優(yōu)化 193
6.6.11 使用表內(nèi)連接進(jìn)行l(wèi)imit分頁(yè)優(yōu)化 194
6.6.12 union all優(yōu)化(基于MySQL 8.0+) 194
6.6.13 or優(yōu)化(基于MySQL 8.0+) 194
6.6.14 count(*)優(yōu)化 194
6.6.15 on duplicate key update優(yōu)化 195
第7章 InnoDB存儲(chǔ)引擎揭秘和優(yōu)化實(shí)戰(zhàn) 196
7.1 InnoDB存儲(chǔ)引擎實(shí)踐 198
7.2 InnoDB和ACID模型 198
7.2.1 MySQL事務(wù)處理的兩種方法 199
7.2.2 InnoDB MVCC 201
7.3 鎖機(jī)制 201
7.3.1 表級(jí)鎖 201
7.3.2 行級(jí)鎖 202
7.3.3 共享鎖 202
7.3.4 排他鎖 203
7.3.5 意向鎖 205
7.3.6 樂(lè)觀鎖 205
7.3.7 悲觀鎖 206
7.3.8 間隙鎖 206
7.3.9 記錄鎖 208
7.3.10 臨鍵鎖 208
7.3.11 死鎖 209
7.4 事務(wù)隔離級(jí)別 209
7.5 InnoDB內(nèi)存結(jié)構(gòu)解析和優(yōu)化實(shí)戰(zhàn) 213
7.5.1 緩沖池原理和優(yōu)化 213
7.5.2 變更緩沖區(qū)原理與優(yōu)化 224
7.5.3 自適應(yīng)哈希索引原理與配置 226
7.5.4 日志緩沖區(qū) 226
7.6 InnoDB表實(shí)戰(zhàn)調(diào)優(yōu) 227
7.6.1 優(yōu)化InnoDB表的存儲(chǔ) 227
7.6.2 InnoDB事務(wù)處理優(yōu)化 229
7.6.3 InnoDB只讀事務(wù)優(yōu)化 229
7.6.4 優(yōu)化InnoDB重做日志 229
7.6.5 InnoDB磁盤(pán)I/O優(yōu)化 234
7.6.6 配置InnoDB線程并發(fā)數(shù)量 234
7.6.7 配置InnoDB的I/O讀寫(xiě)后臺(tái)線程數(shù)量 235
7.6.8 InnoDB的并行讀線程數(shù)量 235
7.6.9 InnoDB的I/O容量 236
第8章 MySQL基準(zhǔn)測(cè)試數(shù)據(jù)的備份與還原 237
8.1 基準(zhǔn)測(cè)試 237
8.1.1 Sysbench介紹 238
8.1.2 Sysbench測(cè)試實(shí)操 239
8.2 備份 243
8.3 還原 244
8.3.1 利用source命令導(dǎo)入數(shù)據(jù)庫(kù) 244
8.3.2 利用load data導(dǎo)入數(shù)據(jù) 244
8.3.3 利用mysqlimport導(dǎo)入數(shù)據(jù) 244
第9章 MySQL高性能架構(gòu)的讀寫(xiě)分離 245
9.1 讀寫(xiě)分離 245
9.2 MySQL主從復(fù)制 246
9.3 MySQL主從復(fù)制架構(gòu)的搭建 247
9.3.1 配置主節(jié)點(diǎn) 247
9.3.2 配置從節(jié)點(diǎn) 248
9.3.3 主從復(fù)制 249
附錄 常用函數(shù)速查表 251
A.1 MySQL字符串函數(shù) 251
A.1.1 ASCII(s):返回字符串的ASCII碼 251
A.1.2 char_length(s):返回字符串長(zhǎng)度 251
A.1.3 character_length(s):返回字符串長(zhǎng)度 252
A.1.4 concat(s1,s2,(,sn):字符串合并 252
A.1.5 concat_WS(x, s1,s2,(,sn):字符串合并 252
A.1.6 field(s,s1,s2,():返回字符串出現(xiàn)的位置 253
A.1.7 find_in_set(s1,s2):返回字符串的匹配位置 253
A.1.8 format(x,n):數(shù)字格式化 253
A.1.9 insert(s1,x,len,s2):替換字符串 253
A.1.10 locate(s1,s):獲取字符串出現(xiàn)的位置 254
A.1.11 lcase(s):把字符串中的所有字母轉(zhuǎn)換為小寫(xiě)字母 254
A.1.12 left(s,n):返回字符串的前n個(gè)字符 254
A.1.13 lower(s):把字符串中的所有字母轉(zhuǎn)換為小寫(xiě)字母 254
A.1.14 lpad(s1,len,s2):字符串填充 255
A.1.15 ltrim(s):去掉字符串開(kāi)始處的空格 255
A.1.16 mid(s,n,len):從字符串的指定位置截取子字符串 255
A.1.17 replace(s,s1,s2):字符串替換 256
A.1.18 reverse(s):字符串反轉(zhuǎn) 256
A.1.19 right(s,n):返回字符串后n個(gè)字符 256
A.1.20 rpad(s1,len,s2):在字符串中填充相應(yīng)字符串 256
A.1.21 position(s1 in s):獲取子字符串在字符串中出現(xiàn)的位置 257
A.1.22 repeat(s,n):字符串重復(fù)拼接 257
A.1.23 substring_index(s, s2, number):返回字符串中第n個(gè)出現(xiàn)的子字符串 257
A.1.24 trim(s):去掉字符串開(kāi)始和結(jié)尾處的空格 258
A.1.25 ucase(s):把字符串中的所有字母轉(zhuǎn)換為大寫(xiě)字母 258
A.1.26 rtrim(s):去掉字符串結(jié)尾處的空格 258
A.1.27 strcmp(s1,s2):比較字符串的大小 258
A.1.28 substr(s, start, length):從字符串中截取子字符串 259
A.1.29 substring(s, start, length):從字符串中截取子字符串 259
A.1.30 md5(s):字符串加密 259
A.1.31 inet_aton (ip):把IP地址轉(zhuǎn)換為數(shù)字 260
A.1.32 inet_ntoa(s):把數(shù)字轉(zhuǎn)換為IP地址 260
A.2 MySQL數(shù)字函數(shù) 260
A.2.1 abs(x):求絕對(duì)值 260
A.2.2 sign(x):返回?cái)?shù)字符號(hào) 260
A.2.3 acos(x):求反余弦值 261
A.2.4 asin(x):求反正弦值 261
A.2.5 atan (x):求反正切值 261
A.2.6 sin(x):求正弦值 262
A.2.7 cos(x):求余弦值 262
A.2.8 cot(x):求余切值 262
A.2.9 tan(x):求正切值 262
A.2.10 degrees(x):將弧度轉(zhuǎn)換為角度 263
A.2.11 radians(x):將角度轉(zhuǎn)換為弧度 263
A.2.12 exp(x):返回e的x次方 263
A.2.13 ceil(x):返回不小于x的最小整數(shù) 264
A.2.14 ceiling(x):返回不小于x的最小整數(shù) 264
A.2.15 floor(x):返回不大于x的最大整數(shù) 264
A.2.16 round(x):返回最接近x的整數(shù) 264
A.2.17 greatest(expr1,expr2, ():返回列表中的最大值 265
A.2.18 least(expr1, expr2, expr3, ():返回列表中的最小值 265
A.2.19 ln(x):求自然對(duì)數(shù) 265
A.2.20 log(x)或log(base, x):求對(duì)數(shù) 266
A.2.21 log10(x):求以10為底的對(duì)數(shù) 266
A.2.22 log2(x):求以2為底的對(duì)數(shù) 266
A.2.23 max(expression):求最大值 267
A.2.24 min(expression):求最小值 267
A.2.25 sum(expression):求總和 268
A.2.26 avg(expression):求平均值 268
A.2.27 count(expression):求總記錄數(shù) 268
A.2.28 mod(x,y):求余數(shù) 269
A.2.29 pow(x,y):求x的y次方 269
A.2.30 sqrt(x):求平方根 269
A.2.31 rand():求隨機(jī)數(shù) 270
A.2.32 truncate(x,y):返回保留到小數(shù)點(diǎn)后n位的值 270
A.3 MySQL日期函數(shù) 270
A.3.1 adddate(d,n):返回指定日期加上指定天數(shù)后的日期 270
A.3.2 addtime(t,n):返回指定時(shí)間加上指定時(shí)間后的時(shí)間 271
A.3.3 curdate():返回當(dāng)前日期 271
A.3.4 current_date():返回當(dāng)前日期 271
A.3.5 current_time():返回當(dāng)前時(shí)間 272
A.3.6 current_timestamp():返回當(dāng)前日期和時(shí)間 272
A.3.7 curtime():返回當(dāng)前時(shí)間 272
A.3.8 date(t):從指定日期時(shí)間中提取日期值 272
A.3.9 datediff(d1,d2):返回兩個(gè)日期相隔的天數(shù) 273
A.3.10 date_add(d, interval expr type):給指定日期加上一個(gè)時(shí)間段后的日期 273
A.3.11 date_format(d,f):根據(jù)表達(dá)式顯示日期 273
A.3.12 date_sub(date, interval expr type):從當(dāng)前日期減去指定的時(shí)間間隔 274
A.3.13 day(d):返回日期值中的日值 274
A.3.14 dayname(d):返回指定日期是星期幾 274
A.3.15 dayofmonth(d):返回指定日期是本月的第幾天 275
A.3.16 dayofweek(d):返回指定日期是所在星期的第幾天 275
A.3.17 dayofyear(d):返回指定日期是本年的第幾天 275
A.3.18 extract (type from d):根據(jù)對(duì)應(yīng)格式返回日期 275
A.3.19 from_days(n):返回元年加n天的日期 277
A.3.20 hour(t):返回指定時(shí)間中的小時(shí)數(shù) 277
A.3.21 last_day(d):返回給定日期所在月份的最后一天 277
A.3.22 localtime():返回當(dāng)前日期和時(shí)間 277
A.3.23 localtimestamp():返回當(dāng)前日期和時(shí)間 278
A.3.24 makedate(year, day-of-year):時(shí)間組合天數(shù) 278
A.3.25 maketime(hour, minute, second):時(shí)間組合 278
A.3.26 microsecond(date):返回時(shí)間參數(shù)中的微秒數(shù) 278
A.3.27 minute(t):返回指定時(shí)間中的分鐘數(shù) 279
A.3.28 monthname(d):返回日期中的月份名稱 279
A.3.29 month(d):返回日期中的月份值 279
A.3.30 now():返回當(dāng)前日期和時(shí)間 279
A.3.31 period_add(period, number):日期加月份數(shù) 280
A.3.32 period_diff(period1, period2):返回兩個(gè)時(shí)間之間的月份差 280
A.3.33 quarter(d):返回日期對(duì)應(yīng)的季度數(shù) 280
A.3.34 second(t):返回指定時(shí)間中的秒數(shù) 280
A.3.35 sec_to_time(s):秒數(shù)轉(zhuǎn)換為時(shí)間 281
A.3.36 str_to_date(string, format_mask):把字符串轉(zhuǎn)換為日期 281
A.3.37 subdate(d,n):從指定日期減去指定天數(shù)后的日期 281
A.3.38 subtime(t,n):從指定時(shí)間減去指定秒數(shù)后的時(shí)間 282
A.3.39 sysdate():返回當(dāng)前日期和時(shí)間 282
A.3.40 time(expression):提取日期時(shí)間參數(shù)中的時(shí)間部分 282
A.3.41 time_format(t,f):根據(jù)表達(dá)式顯示時(shí)間 282
A.3.42 time_to_sec(t):把時(shí)間轉(zhuǎn)換為秒數(shù) 283
A.3.43 timediff(time1, time2):計(jì)算時(shí)間差 283
A.3.44 timestamp(expression, interval):指定時(shí)間加上時(shí)間間隔后的時(shí)間 283
A.3.45 to_days(d):計(jì)算元年到當(dāng)前日期的天數(shù) 283
A.3.46 week(d):返回指定日期是本年的第幾周 284
A.3.47 weekday(d):返回指定日期是星期幾 284
A.3.48 year(d):返回指定日期的年份 284
A.4 MySQL高級(jí)函數(shù) 285
A.4.1 bin(x):返回字符串的二進(jìn)制編碼 285
A.4.2 binary(s):將字符串轉(zhuǎn)換為二進(jìn)制數(shù) 285
A.4.3 case expression:表達(dá)式分支 285
A.4.4 cast(x as type):數(shù)據(jù)類型轉(zhuǎn)換 286
A.4.5 coalesce(expr1,(,exprn):返回第一個(gè)非空表達(dá)式 286
A.4.6 connection_id():返回唯一連接ID 286
A.4.7 conv(x,f1,f2):數(shù)據(jù)進(jìn)制轉(zhuǎn)換 287
A.4.8 convert(s using cs):求字符串的字符集 287
A.4.9 current_user():返回當(dāng)前的用戶名 287
A.4.10 database():返回當(dāng)前的數(shù)據(jù)庫(kù)名 287
A.4.11 if(expr,v1,v2):表達(dá)式判斷 288
A.4.12 ifnull(v1,v2):null替換 288
A.4.13 isnull(expression):判斷表達(dá)式是否為null 288
A.4.14 nullif(expr1, expr2):字符串相等則返回null 289
A.4.15 last_insert_id():返回最近生成的自增ID 289
A.4.16 session_user():返回當(dāng)前會(huì)話的用戶名 290
A.4.17 version():返回?cái)?shù)據(jù)庫(kù)的版本號(hào) 290