關(guān)于我們
書單推薦
新書推薦
|
MySQL應(yīng)用實戰(zhàn)與性能調(diào)優(yōu) 讀者對象:數(shù)據(jù)庫管理員
MySQL是流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)之一。書中從數(shù)據(jù)設(shè)計和數(shù)據(jù)庫的基本使用開始介紹,逐步深入一些復(fù)雜的內(nèi)容,包括連接查詢的使用、子查詢、字符串函數(shù)、數(shù)字函數(shù)、日期函數(shù)以及新版本的窗口函數(shù),還包括存儲過程、游標(biāo)、創(chuàng)建高效的索引以及SQL優(yōu)化技巧等。通過大量的示例應(yīng)用,系統(tǒng)地講述讀者應(yīng)該掌握的知識,以及對于數(shù)據(jù)庫的優(yōu)化,其中包括MySQL的架構(gòu)以及MySQL 8的新特征,也包含MySQL基準(zhǔn)測試和性能剖析,數(shù)據(jù)庫軟硬件性能優(yōu)化,內(nèi)存優(yōu)化,復(fù)制、備份和恢復(fù),高可用與高可擴(kuò)展性,尤其對于MySQL中各種鎖機(jī)制以及MySQL的MVCC的核心原理都一一通過理論和大量的示例進(jìn)行解析,以方便讀者理解。
前言
第1章 MySQL入門和容器化部署 1 1.1 MySQL介紹 1 1.2 MySQL 8安裝和升級 2 1.2.1 安裝前說明 2 1.2.2 在Windows上安裝MySQL 2 1.2.3 在Linux上安裝MySQL 8 1.2.4 在Docker上安裝MySQL 12 第2章 什么樣的數(shù)據(jù)庫設(shè)計才是優(yōu)秀的 17 2.1 關(guān)系型數(shù)據(jù)庫設(shè)計理論 17 2.2 連接數(shù)據(jù)庫和基本信息查詢 21 2.2.1 連接數(shù)據(jù)庫 21 2.2.2 基本信息查詢 21 2.3 數(shù)據(jù)庫和表 25 2.3.1 創(chuàng)建數(shù)據(jù)庫 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ù)據(jù)類型 32 2.4.3 字符串?dāng)?shù)據(jù)類型 33 2.4.4 JSON數(shù)據(jù)類型 39 第3章 SQL語句全面解析和應(yīng)用實戰(zhàn) 44 3.1 數(shù)據(jù)庫操作 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)計再統(tǒng)計) 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 臨時表 74 第4章 MySQL函數(shù)大全和高效率匯總統(tǒng)計實戰(zhàn) 76 4.1 MySQL字符串函數(shù) 76 4.1.1 character_length(s):返回字符串長度 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)換為小寫字母 78 4.1.8 ucase(s):把字符串中的所有字母轉(zhuǎn)換為大寫字母 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):返回指定時間加上指定時間后的時間 84 4.3.3 curdate():返回當(dāng)前日期 85 4.3.4 datediff(d1,d2):返回兩個日期相隔的天數(shù) 85 4.3.5 dayofyear(d):返回指定日期是本年的第幾天 85 4.3.6 extract(type from d):根據(jù)對應(yīng)格式返回日期 85 4.3.7 now():返回當(dāng)前日期和時間 86 4.3.8 quarter(d):返回日期對應(yīng)的季度數(shù) 87 4.3.9 second(t):返回指定時間中的秒數(shù) 87 4.3.10 timediff(time1, time2):計算時間差 87 4.3.11 date(t):從指定日期時間中提取日期值 88 4.3.12 hour(t):返回指定時間中的小時數(shù) 88 4.3.13 time(expression):提取日期時間參數(shù)中的時間部分 88 4.3.14 time_format(t,f):根據(jù)表達(dá)式顯示時間 88 4.3.15 year(d):返回指定日期的年份 89 4.4 MySQL高級函數(shù) 89 4.4.1 cast(x as type):數(shù)據(jù)類型轉(zhuǎn)換 89 4.4.2 coalesce(expr1, (, exprn):返回第一個非空表達(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():跳級排名函數(shù) 95 4.5.3 dense_rank():不跳級排名函數(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ù),返回第一個值 98 4.5.7 last_value(expr):頭尾函數(shù),返回最后一個值 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ū)對null的處理 126 5.1.9 分區(qū)管理 132 5.1.10 分區(qū)的限制 138 5.2 視圖 142 5.3 存儲過程 145 5.3.1 存儲過程的創(chuàng)建和調(diào)用 145 5.3.2 帶參數(shù)的存儲過程 147 5.3.3 變量 150 5.3.4 注釋 151 5.3.5 存儲過程的修改和刪除 152 5.3.6 存儲過程的控制語句 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í)行計劃分析 167 6.5 高效SQL的索引檢索原理 183 6.5.1 主鍵索引 183 6.5.2 普通索引 187 6.5.3 復(fù)合索引 189 6.6 索引的使用技巧與SQL優(yōu)化實戰(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 在字段上計算不能命中索引 193 6.6.8 查詢條件類型不一致不能命中索引 193 6.6.9 明確知道只返回一條記錄可以使用limit進(jìn)行限制 193 6.6.10 limit分頁優(yōu)化 193 6.6.11 使用表內(nèi)連接進(jìn)行l(wèi)imit分頁優(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存儲引擎揭秘和優(yōu)化實戰(zhàn) 196 7.1 InnoDB存儲引擎實踐 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 表級鎖 201 7.3.2 行級鎖 202 7.3.3 共享鎖 202 7.3.4 排他鎖 203 7.3.5 意向鎖 205 7.3.6 樂觀鎖 205 7.3.7 悲觀鎖 206 7.3.8 間隙鎖 206 7.3.9 記錄鎖 208 7.3.10 臨鍵鎖 208 7.3.11 死鎖 209 7.4 事務(wù)隔離級別 209 7.5 InnoDB內(nèi)存結(jié)構(gòu)解析和優(yōu)化實戰(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表實戰(zhàn)調(diào)優(yōu) 227 7.6.1 優(yōu)化InnoDB表的存儲 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磁盤I/O優(yōu)化 234 7.6.6 配置InnoDB線程并發(fā)數(shù)量 234 7.6.7 配置InnoDB的I/O讀寫后臺線程數(shù)量 235 7.6.8 InnoDB的并行讀線程數(shù)量 235 7.6.9 InnoDB的I/O容量 236 第8章 MySQL基準(zhǔn)測試數(shù)據(jù)的備份與還原 237 8.1 基準(zhǔn)測試 237 8.1.1 Sysbench介紹 238 8.1.2 Sysbench測試實操 239 8.2 備份 243 8.3 還原 244 8.3.1 利用source命令導(dǎo)入數(shù)據(jù)庫 244 8.3.2 利用load data導(dǎo)入數(shù)據(jù) 244 8.3.3 利用mysqlimport導(dǎo)入數(shù)據(jù) 244 第9章 MySQL高性能架構(gòu)的讀寫分離 245 9.1 讀寫分離 245 9.2 MySQL主從復(fù)制 246 9.3 MySQL主從復(fù)制架構(gòu)的搭建 247 9.3.1 配置主節(jié)點 247 9.3.2 配置從節(jié)點 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):返回字符串長度 251 A.1.3 character_length(s):返回字符串長度 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)換為小寫字母 254 A.1.12 left(s,n):返回字符串的前n個字符 254 A.1.13 lower(s):把字符串中的所有字母轉(zhuǎn)換為小寫字母 254 A.1.14 lpad(s1,len,s2):字符串填充 255 A.1.15 ltrim(s):去掉字符串開始處的空格 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個字符 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個出現(xiàn)的子字符串 257 A.1.24 trim(s):去掉字符串開始和結(jié)尾處的空格 258 A.1.25 ucase(s):把字符串中的所有字母轉(zhuǎn)換為大寫字母 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):求絕對值 260 A.2.2 sign(x):返回數(shù)字符號 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):求自然對數(shù) 265 A.2.20 log(x)或log(base, x):求對數(shù) 266 A.2.21 log10(x):求以10為底的對數(shù) 266 A.2.22 log2(x):求以2為底的對數(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ù)點后n位的值 270 A.3 MySQL日期函數(shù) 270 A.3.1 adddate(d,n):返回指定日期加上指定天數(shù)后的日期 270 A.3.2 addtime(t,n):返回指定時間加上指定時間后的時間 271 A.3.3 curdate():返回當(dāng)前日期 271 A.3.4 current_date():返回當(dāng)前日期 271 A.3.5 current_time():返回當(dāng)前時間 272 A.3.6 current_timestamp():返回當(dāng)前日期和時間 272 A.3.7 curtime():返回當(dāng)前時間 272 A.3.8 date(t):從指定日期時間中提取日期值 272 A.3.9 datediff(d1,d2):返回兩個日期相隔的天數(shù) 273 A.3.10 date_add(d, interval expr type):給指定日期加上一個時間段后的日期 273 A.3.11 date_format(d,f):根據(jù)表達(dá)式顯示日期 273 A.3.12 date_sub(date, interval expr type):從當(dāng)前日期減去指定的時間間隔 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ù)對應(yīng)格式返回日期 275 A.3.19 from_days(n):返回元年加n天的日期 277 A.3.20 hour(t):返回指定時間中的小時數(shù) 277 A.3.21 last_day(d):返回給定日期所在月份的最后一天 277 A.3.22 localtime():返回當(dāng)前日期和時間 277 A.3.23 localtimestamp():返回當(dāng)前日期和時間 278 A.3.24 makedate(year, day-of-year):時間組合天數(shù) 278 A.3.25 maketime(hour, minute, second):時間組合 278 A.3.26 microsecond(date):返回時間參數(shù)中的微秒數(shù) 278 A.3.27 minute(t):返回指定時間中的分鐘數(shù) 279 A.3.28 monthname(d):返回日期中的月份名稱 279 A.3.29 month(d):返回日期中的月份值 279 A.3.30 now():返回當(dāng)前日期和時間 279 A.3.31 period_add(period, number):日期加月份數(shù) 280 A.3.32 period_diff(period1, period2):返回兩個時間之間的月份差 280 A.3.33 quarter(d):返回日期對應(yīng)的季度數(shù) 280 A.3.34 second(t):返回指定時間中的秒數(shù) 280 A.3.35 sec_to_time(s):秒數(shù)轉(zhuǎn)換為時間 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ù)后的時間 282 A.3.39 sysdate():返回當(dāng)前日期和時間 282 A.3.40 time(expression):提取日期時間參數(shù)中的時間部分 282 A.3.41 time_format(t,f):根據(jù)表達(dá)式顯示時間 282 A.3.42 time_to_sec(t):把時間轉(zhuǎn)換為秒數(shù) 283 A.3.43 timediff(time1, time2):計算時間差 283 A.3.44 timestamp(expression, interval):指定時間加上時間間隔后的時間 283 A.3.45 to_days(d):計算元年到當(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高級函數(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):返回第一個非空表達(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ù)庫名 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)前會話的用戶名 290 A.4.17 version():返回數(shù)據(jù)庫的版本號 290
你還可能感興趣
我要評論
|