本书全面、系统地介绍MySQL数据库技术,主要阐述MySQL开发、优化和运维过程中的各项技术点。本书对MySQL学习者有较高的参考价值,尤其是环境搭建、优化、维护和架构等相关内容,读者稍加修改便可直接用于实际工作中。另外,作者专门为本书录制了大量的配套教学视频,可以大大提高读者的学习效率。本书共33章,分为6篇:第1篇介绍MySQL基础知识;第2篇介绍环境搭建;第3篇介绍MySQL开发;第4篇介绍MySQL优化;第5篇介绍MySQL维护;第6篇介绍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版本的MySQL78
- 6.1.1 下载MySQL的MSI安装包78
- 6.1.2 基于MSI文件安装MySQL80
- 6.1.3 配置MySQL系统环境变量90
- 6.1.4 测试MySQL92
- 6.2 基于ZIP文件安装Windows版本的MySQL92
- 6.2.1 下载MySQL的ZIP安装包92
- 6.2.2 基于ZIP文件安装MySQL94
- 6.2.3 配置MySQL系统环境变量96
- 6.2.4 测试MySQL97
- 6.3 基于DMG文件安装Mac OS X版本的MySQL98
- 6.3.1 下载MySQL的DMG安装包98
- 6.3.2 基于DMG文件安装MySQL100
- 6.3.3 配置MySQL系统环境变量102
- 6.3.4 测试MySQL104
- 6.4 基于GZ文件安装Mac OS X版本的MySQL105
- 6.4.1 下载MySQL的GZ安装包105
- 6.4.2 基于GZ文件安装MySQL105
- 6.4.3 配置MySQL系统环境变量107
- 6.4.4 测试MySQL107
- 6.5 基于RPM文件安装CentOS版本的MySQL109
- 6.5.1 删除CentOS 6.8服务器自带的MySQL109
- 6.5.2 下载MySQL的RPM安装包110
- 6.5.3 基于RPM文件安装MySQL111
- 6.5.4 测试MySQL113
- 6.6 基于源码安装CentOS版本的MySQL114
- 6.6.1 环境准备115
- 6.6.2 下载软件包116
- 6.6.3 升级gcc和cmake117
- 6.6.4 编译安装MySQL源码119
- 6.6.5 配置MySQL120
- 6.6.6 初始化并启动MySQL服务123
- 6.6.7 测试MySQL123
- 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 非递归CTE456
- 19.1.2 递归CTE457
- 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数据库分析MySQL530
- 26.1.1 查看MySQL是否支持performance_schema530
- 26.1.2 开启或关闭performance_schema532
- 26.1.3 performance_schema的简单配置与使用532
- 26.2 使用sys数据库分析MySQL535
- 26.2.1 sys数据库概述535
- 26.2.2 sys数据库的常用查询535
- 26.3 MySQL 8.x中的资源组538
- 26.3.1 开启 CAP_SYS_NICE538
- 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 安装mydumper583
- 29.3.2 备份数据584
- 29.3.3 恢复数据588
- 29.4 基于mysqlhotcopy备份并恢复数据589
- 29.4.1 安装mysqlhotcopy589
- 29.4.2 备份数据590
- 29.4.3 恢复数据590
- 29.5 基于xtrabackup备份并恢复数据590
- 29.5.1 安装xtrabackup590
- 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 Proxy679
- 32.1.4 配置MySQL Proxy读写分离680
- 32.1.5 启动MySQL Proxy683
- 32.1.6 测试MySQL Proxy的读写分离683
- 32.2 基于Atlas实现读写分离685
- 32.2.1 服务器规划685
- 32.2.2 安装Atlas685
- 32.2.3 配置Atlas读写分离686
- 32.2.4 启动Atlas687
- 32.2.5 测试Atlas读写分离689
- 32.3 基于ProxySQL实现读写分离689
- 32.3.1 服务器规划689
- 32.3.2 安装ProxySQL690
- 32.3.3 配置ProxySQL读写分离690
- 32.3.4 测试ProxySQL读写分离695
- 32.4 基于Amoeba实现读写分离695
- 32.4.1 服务器规划695
- 32.4.2 安装JDK695
- 32.4.3 安装Amoeba696
- 32.4.4 配置Amoeba读写分离697
- 32.4.5 启动Amoeba699
- 32.4.6 测试Amoeba读写分离700
- 32.5 基于Mycat实现读写分离700
- 32.5.1 服务器规划701
- 32.5.2 安装JDK701
- 32.5.3 安装Mycat701
- 32.5.4 配置Mycat读写分离702
- 32.5.5 启动Mycat703
- 32.5.6 测试Mycat读写分离704
- 32.6 本章总结704
- 第33章 MySQL HA高可用架构705
- 33.1 基于Keepalived搭建MySQL高可用环境705
- 33.1.1 服务器规划705
- 33.1.2 安装Keepalived706
- 33.1.3 配置MySQL高可用707
- 33.1.4 测试MySQL高可用710
- 33.1.5 自动重启MySQL711
- 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和Keepalived721
- 33.3.3 配置HAProxy高可用性722
- 33.3.4 测试HAProxy高可用性725
- 33.4 本章总结726
- 参考文献727