首页>参考读物>计算机科学与技术>数据库

MySQL应用实战与性能调优
作者 : 张文亮 编著
出版日期 : 2022-04-20
ISBN : 978-7-111-70098-2
定价 : 79.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 304
开本 : 16
原书名 :
原出版社:
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

MySQL是流行的关系型数据库管理系统之一。书中从数据设计和数据库的基本使用开始介绍,逐步深入一些复杂的内容,包括连接查询的使用、子查询、字符串函数、数字函数、日期函数以及新版本的窗口函数,还包括存储过程、游标、创建高效的索引以及SQL优化技巧等。通过大量的示例应用,系统地讲述读者应该掌握的知识,以及对于数据库的优化,其中包括MySQL的架构以及MySQL 8的新特征,也包含MySQL基准测试和性能剖析,数据库软硬件性能优化,内存优化,复制、备份和恢复,高可用与高可扩展性,尤其对于MySQL中各种锁机制以及MySQL的MVCC的核心原理都一一通过理论和大量的示例进行解析,以方便读者理解。

图书特色

内容简洁,重点突出
让你看得懂、学得会

循序渐进,实战为主,学习、参考皆宜
实用技巧融入案例中,可查可练

图书前言

  在工作中,我们经常使用基本的SQL语句,但是大部分用户只会简单的增、删、改、查,进一步可能就是创建索引,当索引没有起到作用时,基本再无招架之力。
  针对MySQL的面试,90%以上都会问以下问题:
  1)SQL语句是如何执行的?
  2)索引的检索原理是什么,如何创建高效的索引?
  3)如何提高索引的使用?
  4)如何做到索引覆盖,如何避免回表查询,如何使用索引条件下推?
  5)回滚日志、重做日志、二进制日志的作用是什么?
  6)如何利用复合索引和前缀索引提高SQL性能?
  7)事务的隔离是如何实现的?
  8)InnoDB如何解决幻读和不可重复读问题?
  9)表锁、行锁、排他锁、意向锁、间隙锁、记录锁、临键锁在MySQL中如何实现,它们解决了什么问题?
  10)SQL服务慢,该如何排查?
  11)除了索引外,如何根据自己的服务器设备来进行软硬件优化?
  除了以上问题外,还有很多未列出的问题。为了解决这些问题,才有了本书。作者不只是简单地通过理论知识来讲述这些问题,还列举了大量的示例,比如每一种锁是如何使用的,如何通过代码来操作,旨在以示例和理论相结合的方式进行系统的讲述。对于想提升自己业务能力的读者来说,本书不仅提供了索引的优化,而且根据作者多年的DBA经验列举了大量的经典案例。本书可能不是很全面,但包含业务中80%以上的应用场景,对于没有深入研究过任何一种关系型数据库的读者来说,本书可能会为你开启学习数据库的大门。通过阅读本书,读者不仅能快速高效地解决业务问题,还能站在数据库管理员的角度来优化自己的数据库。此外,本书还提供了与MySQL内部工作原理相关的内容,读者越是了解MySQL的工作原理,就越能合理地解决工程中遇到的问题。
  本书的资源文件可以登录机械工业出版社华章分社的网站(www.hzbook.com)下载,方法是:搜索到本书,然后在页面上的“资源下载”模块下载即可。如果下载有问题,请发送电子邮件至booksaga@126.com,邮件主题为“MySQL应用实战与性能调优”。如果读者有兴趣,也可以加入QQ技术交流群(823440562)参与讨论。
  最后,感谢各位读者选择了本书,希望读者有所收获,并且在使用MySQL的业务场景中学习到更多实践技巧。虽然作者对书中的内容尽量一一核实,但因水平所限,难免存在疏漏之处,敬请广大读者批评指正。作者会不断地完善此书,以此来回报读者对本书的支持。
  
  张文亮  
  2021年10月

上架指导

计算机\程序设计

封底文字

本书可以解答如下常见的问题:
1 SQL语句是如何执行的?
2 索引的检索原理是什么,如何创建高效的索引?
3 如何提高索引的使用?
4 如何做到索引覆盖,如何避免回表查询,如何使用索引条件下推?
5 回滚日志、重做日志、二进制日志的作用是什么?
6 如何利用复合索引和前缀索引提高SQL性能?
7 事务的隔离是如何实现的?
8 InnoDB如何解决幻读和不可重复读问题?
9 表锁、行锁、排他锁、意向锁、间隙锁、记录锁、临键锁在 
  MySQL中如何实现,它们解决了什么问题?
10 SQL服务慢,该如何排查?
11 除了索引外,如何根据自己的服务器设备来进行软硬件优化?

本书从初学者的角度出发,通过通俗易懂的语言和经典的案例详细介绍了学习MySQL需要掌握的重点技术。本书没有过多阐述数据库基础理论,而是紧贴实战要求,内容涵盖实际工作中80%以上的应用场景,无论是初学者还是对MySQL有一定了解的读者,都能从本书中获益。

图书目录

前言
第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章 什么样的数据库设计才是优秀的 17
2.1 关系型数据库设计理论 17
2.2 连接数据库和基本信息查询 21
2.2.1 连接数据库 21
2.2.2 基本信息查询 21
2.3 数据库和表 25
2.3.1 创建数据库 26
2.3.2 创建表 27
2.4 数据类型和类型异常处理 28
2.4.1 数字数据类型 28
2.4.2 日期和时间数据类型 32
2.4.3 字符串数据类型 33
2.4.4 JSON数据类型 39
第3章 SQL语句全面解析和应用实战 44
3.1 数据库操作 44
3.2 数据表操作 46
3.2.1 创建数据表 46
3.2.2 数据表的修改与删除 48
3.2.3 约束 49
3.3 数据查询 50
3.4 数据插入 51
3.5 where(筛选) 52
3.6 and和or(与和或) 54
3.7 between(范围查找) 55
3.8 distinct(去重关键字) 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(分组统计再统计) 63
3.15 having(分组筛选) 64
3.16 union和union all(组合查询) 64
3.17 join(连接查询) 67
3.17.1 inner join(内连接) 68
3.17.2 left join(左连接) 69
3.17.3 right join(右连接) 70
3.18 in和not in(多关键字筛选) 71
3.19 exists和not exists(是否返回结果集) 72
3.20 复制表 73
3.21 临时表 74
第4章 MySQL函数大全和高效率汇总统计实战 76
4.1 MySQL字符串函数 76
4.1.1 character_length(s):返回字符串长度 76
4.1.2 concat(s1,s2,(,sn):字符串合并 77
4.1.3 format(x,n):数字格式化 77
4.1.4 lpad(s1,len,s2):字符串填充 77
4.1.5 field(s,s1,s2,():返回字符串出现的位置 77
4.1.6 insert(s1,x,len,s2):替换字符串 78
4.1.7 lcase(s):把字符串中的所有字母转换为小写字母 78
4.1.8 ucase(s):把字符串中的所有字母转换为大写字母 78
4.1.9 strcmp(s1,s2):比较字符串大小 78
4.1.10 replace(s,s1,s2):字符串替换 79
4.1.11 position(s1 in s):获取子字符串在字符串中出现的位置 79
4.1.12 md5(s):字符串加密 79
4.1.13 inet_aton(ip):把IP地址转换为数字 80
4.1.14 inet_ntoa (s):把数字转换为IP地址 80
4.2 MySQL数字函数 80
4.2.1 ceil(x):返回不小于x的最小整数 80
4.2.2 ceiling(x):返回不小于x的最小整数 80
4.2.3 floor(x):返回不大于x的最大整数 81
4.2.4 round(x):返回最接近x的整数 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):求总记录数 83
4.3 MySQL日期函数 84
4.3.1 adddate(d,n):返回指定日期加上指定天数后的日期 84
4.3.2 addtime(t,n):返回指定时间加上指定时间后的时间 84
4.3.3 curdate():返回当前日期 85
4.3.4 datediff(d1,d2):返回两个日期相隔的天数 85
4.3.5 dayofyear(d):返回指定日期是本年的第几天 85
4.3.6 extract(type from d):根据对应格式返回日期 85
4.3.7 now():返回当前日期和时间 86
4.3.8 quarter(d):返回日期对应的季度数 87
4.3.9 second(t):返回指定时间中的秒数 87
4.3.10 timediff(time1, time2):计算时间差 87
4.3.11 date(t):从指定日期时间中提取日期值 88
4.3.12 hour(t):返回指定时间中的小时数 88
4.3.13 time(expression):提取日期时间参数中的时间部分 88
4.3.14 time_format(t,f):根据表达式显示时间 88
4.3.15 year(d):返回指定日期的年份 89
4.4 MySQL高级函数 89
4.4.1 cast(x as type):数据类型转换 89
4.4.2 coalesce(expr1, (, exprn):返回第一个非空表达式 89
4.4.3 if(expr,v1,v2):表达式判断 90
4.4.4 ifnull(v1,v2):null替换 90
4.4.5 isnull(expression):判断表达式是否为null 90
4.4.6 nullif(expr1, expr2):字符串相等则返回null 91
4.4.7 last_insert_id():返回最近生成的自增ID 91
4.4.8 case expression:表达式分支 92
4.5 MySQL over():窗口函数汇总分析 92
4.5.1 row _number():顺序排名函数 94
4.5.2 rank():跳级排名函数 95
4.5.3 dense_rank():不跳级排名函数 96
4.5.4 lag(expr,n):前分析函数,返回前n行的值 96
4.5.5 lead(expr,n):后分析函数,返回后n行的值 98
4.5.6 first_value(expr):头尾函数,返回第一个值 98
4.5.7 last_value(expr):头尾函数,返回最后一个值 99
4.5.8 nth_value(expr,n):从结果集中的第n行获取值 101
4.5.9 ntile(n):数据集分桶 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):聚合总条数 105
第5章 MySQL大表快速优化诀窍 107
5.1 分区 107
5.1.1 分区类型 108
5.1.2 范围分区 108
5.1.3 列表分区 111
5.1.4 列分区 113
5.1.5 哈希分区 121
5.1.6 键分区 124
5.1.7 子分区 125
5.1.8 MySQL分区对null的处理 126
5.1.9 分区管理 132
5.1.10 分区的限制 138
5.2 视图 142
5.3 存储过程 145
5.3.1 存储过程的创建和调用 145
5.3.2 带参数的存储过程 147
5.3.3 变量 150
5.3.4 注释 151
5.3.5 存储过程的修改和删除 152
5.3.6 存储过程的控制语句 152
5.4 游标 154
5.5 字符集和排序规则 157
5.5.1 MySQL中的字符集和排序规则 157
5.5.2 列字符集和排序规则 160
5.5.3 使用collate指定查询排序规则 160
第6章 MySQL创建高效的索引 162
6.1 索引 162
6.2 创建索引的指导原则 165
6.3 B-Tree索引和哈希索引的比较 166
6.4 高效SQL必备分析利器的执行计划分析 167
6.5 高效SQL的索引检索原理 183
6.5.1 主键索引 183
6.5.2 普通索引 187
6.5.3 复合索引 189
6.6 索引的使用技巧与SQL优化实战 191
6.6.1 避免回表查询 191
6.6.2 尽量使用联合索引 191
6.6.3 索引条件下推优化 192
6.6.4 避免全表扫描 192
6.6.5 负向查询不能使用索引 192
6.6.6 前导模糊查询不能使用索引 193
6.6.7 在字段上计算不能命中索引 193
6.6.8 查询条件类型不一致不能命中索引 193
6.6.9 明确知道只返回一条记录可以使用limit进行限制 193
6.6.10 limit分页优化 193
6.6.11 使用表内连接进行limit分页优化 194
6.6.12 union all优化(基于MySQL 8.0+) 194
6.6.13 or优化(基于MySQL 8.0+) 194
6.6.14 count(*)优化 194
6.6.15 on duplicate key update优化 195
第7章 InnoDB存储引擎揭秘和优化实战 196
7.1 InnoDB存储引擎实践 198
7.2 InnoDB和ACID模型 198
7.2.1 MySQL事务处理的两种方法 199
7.2.2 InnoDB MVCC 201
7.3 锁机制 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 事务隔离级别 209
7.5 InnoDB内存结构解析和优化实战 213
7.5.1 缓冲池原理和优化 213
7.5.2 变更缓冲区原理与优化 224
7.5.3 自适应哈希索引原理与配置 226
7.5.4 日志缓冲区 226
7.6 InnoDB表实战调优 227
7.6.1 优化InnoDB表的存储 227
7.6.2 InnoDB事务处理优化 229
7.6.3 InnoDB只读事务优化 229
7.6.4 优化InnoDB重做日志 229
7.6.5 InnoDB磁盘I/O优化 234
7.6.6 配置InnoDB线程并发数量 234
7.6.7 配置InnoDB的I/O读写后台线程数量 235
7.6.8 InnoDB的并行读线程数量 235
7.6.9 InnoDB的I/O容量 236
第8章 MySQL基准测试数据的备份与还原 237
8.1 基准测试 237
8.1.1 Sysbench介绍 238
8.1.2 Sysbench测试实操 239
8.2 备份 243
8.3 还原 244
8.3.1 利用source命令导入数据库 244
8.3.2 利用load data导入数据 244
8.3.3 利用mysqlimport导入数据 244
第9章 MySQL高性能架构的读写分离 245
9.1 读写分离 245
9.2 MySQL主从复制 246
9.3 MySQL主从复制架构的搭建 247
9.3.1 配置主节点 247
9.3.2 配置从节点 248
9.3.3 主从复制 249
附录 常用函数速查表 251
A.1 MySQL字符串函数 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,():返回字符串出现的位置 253
A.1.7 find_in_set(s1,s2):返回字符串的匹配位置 253
A.1.8 format(x,n):数字格式化 253
A.1.9 insert(s1,x,len,s2):替换字符串 253
A.1.10 locate(s1,s):获取字符串出现的位置 254
A.1.11 lcase(s):把字符串中的所有字母转换为小写字母 254
A.1.12 left(s,n):返回字符串的前n个字符 254
A.1.13 lower(s):把字符串中的所有字母转换为小写字母 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):字符串反转 256
A.1.19 right(s,n):返回字符串后n个字符 256
A.1.20 rpad(s1,len,s2):在字符串中填充相应字符串 256
A.1.21 position(s1 in s):获取子字符串在字符串中出现的位置 257
A.1.22 repeat(s,n):字符串重复拼接 257
A.1.23 substring_index(s, s2, number):返回字符串中第n个出现的子字符串 257
A.1.24 trim(s):去掉字符串开始和结尾处的空格 258
A.1.25 ucase(s):把字符串中的所有字母转换为大写字母 258
A.1.26 rtrim(s):去掉字符串结尾处的空格 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地址转换为数字 260
A.1.32 inet_ntoa(s):把数字转换为IP地址 260
A.2 MySQL数字函数 260
A.2.1 abs(x):求绝对值 260
A.2.2 sign(x):返回数字符号 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):将弧度转换为角度 263
A.2.11 radians(x):将角度转换为弧度 263
A.2.12 exp(x):返回e的x次方 263
A.2.13 ceil(x):返回不小于x的最小整数 264
A.2.14 ceiling(x):返回不小于x的最小整数 264
A.2.15 floor(x):返回不大于x的最大整数 264
A.2.16 round(x):返回最接近x的整数 264
A.2.17 greatest(expr1,expr2, ():返回列表中的最大值 265
A.2.18 least(expr1, expr2, expr3, ():返回列表中的最小值 265
A.2.19 ln(x):求自然对数 265
A.2.20 log(x)或log(base, x):求对数 266
A.2.21 log10(x):求以10为底的对数 266
A.2.22 log2(x):求以2为底的对数 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):求总记录数 268
A.2.28 mod(x,y):求余数 269
A.2.29 pow(x,y):求x的y次方 269
A.2.30 sqrt(x):求平方根 269
A.2.31 rand():求随机数 270
A.2.32 truncate(x,y):返回保留到小数点后n位的值 270
A.3 MySQL日期函数 270
A.3.1 adddate(d,n):返回指定日期加上指定天数后的日期 270
A.3.2 addtime(t,n):返回指定时间加上指定时间后的时间 271
A.3.3 curdate():返回当前日期 271
A.3.4 current_date():返回当前日期 271
A.3.5 current_time():返回当前时间 272
A.3.6 current_timestamp():返回当前日期和时间 272
A.3.7 curtime():返回当前时间 272
A.3.8 date(t):从指定日期时间中提取日期值 272
A.3.9 datediff(d1,d2):返回两个日期相隔的天数 273
A.3.10 date_add(d, interval expr type):给指定日期加上一个时间段后的日期 273
A.3.11 date_format(d,f):根据表达式显示日期 273
A.3.12 date_sub(date, interval expr type):从当前日期减去指定的时间间隔 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):根据对应格式返回日期 275
A.3.19 from_days(n):返回元年加n天的日期 277
A.3.20 hour(t):返回指定时间中的小时数 277
A.3.21 last_day(d):返回给定日期所在月份的最后一天 277
A.3.22 localtime():返回当前日期和时间 277
A.3.23 localtimestamp():返回当前日期和时间 278
A.3.24 makedate(year, day-of-year):时间组合天数 278
A.3.25 maketime(hour, minute, second):时间组合 278
A.3.26 microsecond(date):返回时间参数中的微秒数 278
A.3.27 minute(t):返回指定时间中的分钟数 279
A.3.28 monthname(d):返回日期中的月份名称 279
A.3.29 month(d):返回日期中的月份值 279
A.3.30 now():返回当前日期和时间 279
A.3.31 period_add(period, number):日期加月份数 280
A.3.32 period_diff(period1, period2):返回两个时间之间的月份差 280
A.3.33 quarter(d):返回日期对应的季度数 280
A.3.34 second(t):返回指定时间中的秒数 280
A.3.35 sec_to_time(s):秒数转换为时间 281
A.3.36 str_to_date(string, format_mask):把字符串转换为日期 281
A.3.37 subdate(d,n):从指定日期减去指定天数后的日期 281
A.3.38 subtime(t,n):从指定时间减去指定秒数后的时间 282
A.3.39 sysdate():返回当前日期和时间 282
A.3.40 time(expression):提取日期时间参数中的时间部分 282
A.3.41 time_format(t,f):根据表达式显示时间 282
A.3.42 time_to_sec(t):把时间转换为秒数 283
A.3.43 timediff(time1, time2):计算时间差 283
A.3.44 timestamp(expression, interval):指定时间加上时间间隔后的时间 283
A.3.45 to_days(d):计算元年到当前日期的天数 283
A.3.46 week(d):返回指定日期是本年的第几周 284
A.3.47 weekday(d):返回指定日期是星期几 284
A.3.48 year(d):返回指定日期的年份 284
A.4 MySQL高级函数 285
A.4.1 bin(x):返回字符串的二进制编码 285
A.4.2 binary(s):将字符串转换为二进制数 285
A.4.3 case expression:表达式分支 285
A.4.4 cast(x as type):数据类型转换 286
A.4.5 coalesce(expr1,(,exprn):返回第一个非空表达式 286
A.4.6 connection_id():返回唯一连接ID 286
A.4.7 conv(x,f1,f2):数据进制转换 287
A.4.8 convert(s using cs):求字符串的字符集 287
A.4.9 current_user():返回当前的用户名 287
A.4.10 database():返回当前的数据库名 287
A.4.11 if(expr,v1,v2):表达式判断 288
A.4.12 ifnull(v1,v2):null替换 288
A.4.13 isnull(expression):判断表达式是否为null 288
A.4.14 nullif(expr1, expr2):字符串相等则返回null 289
A.4.15 last_insert_id():返回最近生成的自增ID 289
A.4.16 session_user():返回当前会话的用户名 290
A.4.17 version():返回数据库的版本号 290

教学资源推荐
作者: [美]张超(Chao Zhang) 韩家炜(Jiawei Han) 著
作者: 马义玲 汪令江 曾勇 曾新
作者: [比利时]维尔弗里德·勒玛肖(Wilfried Lemahieu) 赛普·凡登·布鲁克(Seppe vanden Broucke) 巴特·巴森斯(Bart Baesens) 著
参考读物推荐
作者: 纪贺元 著
作者: 嬴图团队 著
作者: (美)Jason S.Couchman,Sudheer N.Marisetti