这个blog,我整理了我之前写的MySQL开发系列和MySQL运维系列,知识丰富程度堪比培训机构
个人能力有限,如有错误的地方,欢迎指正。
文章目录
- 一.MySQL开发系列
- 1.1 MySQL 行转列
- 1.2 MySQL 常用的函数
- 1.3 MySQL 表连接
- 1.4 MySQL分组语句小结
- 1.5 MySQL with语句
- 1.6 MySQL高级窗口函数
- 1.7 MySQL正则表达式
- 1.8 MySQL编程
- 二.MySQL运维系列
- 2.1 MySQL安装
- 2.2 MySQL体系结构
- 2.3 MYSQL启动和关闭
- 2.4 MySQL配置文件
- 2.5 MySQL字符集
- 2.6 MySQL用户及权限
- 2.7 MySQL数据类型
- 2.8 MySQL数据库、表、索引相关命令
- 2.9 MySQL事务和锁
- 2.10 MySQL常用的存储引擎
- 2.11 MySQL的备份和恢复
- 2.12 MySQL高可用
- 2.13 MySQL 运维管理工具--pt(Percona-toolkit)
- 2.14 MySQL 监控软件lepus天兔
一.MySQL开发系列
1.1 MySQL 行转列
MySQL行转列
MySQL行转列是MySQL岗位笔试的一个入门级别的考试题目,做一些日常的统计分析报表的时候经常会被使用到。
很多刚开始学MySQL开发都卡在了行转列这个需求上了,之前B站免费的MySQL高级视频教程(面向java开发的),居然花了2个课时,接近2个小时来讲解MySQL行转列和列转行,可见这个知识点的重要性。
1.2 MySQL 常用的函数
MySQL常用流程控制函数小结
MySQL常用数值函数小结
MySQL常用日期时间函数小结
MySQL常用日期时间函数拓展
MySQL常用字符函数小结
每个数据库都有自己的函数,语法和数量上存在一定的差异。
我遇到过开发(例如java开发,.net开发)的同学,不熟悉数据库间的差异,将Oracle或SqlServer数据库的特定函数用在MySQL里,然后问DBA为何报错,DBA只能改写成MySQL自己支持的函数来实现需求。
也遇到过开发(例如java开发,.net开发)的同学,不熟悉MySQL的函数,然后重复造轮子,耗时较久的通过多层case when、通过多个表连接、通过java集合、java循环来实现本来通过MySQL函数就可以轻松完成的事情。
也遇到过开发(例如java开发,.net开发)的同学遇到搞不定的sql,咨询DBA,结果DBA不熟悉MySQL的函数,通过百度或其它论坛等地提问来解决此类问题。
综上所述,无论是DBA还是开发人员,甚至数据分析人员,都需要熟悉掌握MySQL的常用函数,对自己的实际工作有很大的帮助。
1.3 MySQL 表连接
MySQL 表连接
作为DBA,经常遇到初中级开发提问关于表连接的,问题无外乎如下几种:
1.表连接一对多或者多对多,为什么会有重复数据
2.我用了left join 但是where后面有其它条件,为什么还是少数据
3.我的in、exists很慢,能否优化下
其实通过几个简单的实验,可以快速的弄懂表连接的语法,上述的问题也就比较容易的解决。
MySQL的 全连接、左连接、右连接、内连接
以及基于这些连接在where子句加上 col is null,可以实现去交集等操作
如果可以用表连接实现的,尽量通过表连接实现,在一定的使用场景下,性能会优于in和exists
1.4 MySQL分组语句小结
MySQL分组语句小结
MySQL的高级分组在OLAP应用,如业务报表、数据仓库等,应用得非常广泛。
我就见过不用rollup,然后各种union 的代码
学会这些高级分组函数,进行多维度、多层级分组汇总的时候,可以大大减少代码行数,提升代码的可读性及可维护性。
1.5 MySQL with语句
MySQL with语句
个人强烈推荐大家使用with语句。
没有with语句,进行复杂查询的时候,from子句后面一堆的临时表,而且面临特别复杂的需求的时候,from里的临时表里面可能还会嵌套临时表,代码量可读性、可维护性特别差。
with语句推出后,可以通过with语句封装好各个临时表,临时表直接可以根据顺序相互引用。
大大简化了代码的复杂程度,提升代码的可读性、可维护性
with语句的递归,在一些场景也非常有用
1.6 MySQL高级窗口函数
MySQL高级窗口函数
MySQL高级分析函数与统计函数结合使用
个人强烈推荐大家学习并使用高级分析函数。
MySQL的高级分析函数简直太给力了,往往通过几层临时表的复杂统计分析需求,高级分析函数,往往简单的几行代码就可以搞定,而且性能上也有一定程度的提升。
1.7 MySQL正则表达式
MySQL正则表达式
MySQL的正则表达式相对于其他编程语言而言,比较弱,但是有总比没有强。
MySQL的正则表达式由于要遍历字符串,所以往往性能并不是特别好。
但是,面对复杂、无规则的文本处理的时候,正则表达式可以发挥作用,往往几行简单的代码可以实现复杂的匹配规则。
当然,正则表达式的应用场景较为广泛,我的blog只是简单介绍了下几个正则函数的使用方法,需要在这方面提升的,还需要找寻其它的资料进行练习。
1.8 MySQL编程
MySQL视图
MySQL流程控制语句
MySQL游标
MySQL存储过程
MySQL函数编程
MySQL触发器
MySQL事件
MySQL编程的存储过程,相较于Oracle、SQLServer等数据库较弱,但是有总比没有强。
面对一些复杂的需求,sql不好解决或者解决起来比较麻烦的时候,可以尝试用自定义函数进行解决。
面对一些逻辑特别复杂的,可以通过 事件+存储过程+游标 来解决,能在数据库里面实现的,会比在编程语言里面实现速度更快。
当然,如果是生产环境,使用MySQL的存储过程和游标,要注意性能的开销,个人建议如果是高并发的环境,就不要使用了。
二.MySQL运维系列
2.1 MySQL安装
MySQL Windows下安装
MySQL Linux yum安装
MySQL Linux 源码编译
MySQL的安装无论是开发人员还是DBA,都是必修课,针对不同平台,不同安装方式,都需要熟悉,安装知识点较为简单,对技能要求不高。
正式环境经常遇到复杂的安装环境:
1.主要的核心系统的MySQL数据库是DBA统一安装,规范性高,便于管理
2.部分外购系统MySQL数据库是合作方安装,规范性低,参数配置存在一定的问题
3.部分MySQl数据库是系统运维或开发人员自己安装,规范性低,参数配置存在一定的问题
针对不同方法安装的MYSQL,不同版本的MYSQL,DBA都需要熟悉。
2.2 MySQL体系结构
MySQL 体系结构
MySQL的体系结构是DBA的必修课,对于MYSQL的内存结构、物理结构、逻辑结构及SQL语句的执行过程都需要有一个全面的了解,只有懂底层原理,才能更好的运维和优化自己维护的MySQL数据库。
2.3 MYSQL启动和关闭
MySQL 启动和关闭
MySQL的启动和关闭的方法多种多样,对于从Oracle转到MySQL的DBA,刚开始各种不适应,后面熟悉了,觉得相比较Oracle而言,MySQL更灵活。
2.4 MySQL配置文件
MySQL 配置文件
MySQL的配置文件,对于运维和优化而言是非常重要的,常用的配置文件的选项及各种选项对应的应用场景。
生产环境中,很多异常问题,都是DBA通过调整参数来解决的。
生产环境中,很多慢SQL,都是DBA通过调整参数来优化的。
2.5 MySQL字符集
MySQL 字符集
从Oracle转到MySQL的DBA想必很多都被MySQL的字符集问题给困扰过。
为什么默认的字符集怎么是latin1?
为什么系统字符集、数据库字符集、表字符集、列字符集居然都可以不一样?
为什么除了字符集不同之外,同一个字符集还有不同的排序规则?
其实了解之后,发现MySQL是为了适用不同的应用场景,将字符集设置得更为灵活
这样带来的问题就是,如果开发不熟悉字符集,DBA也没有通过变更前的SQL审核审核出来,随之而来的乱码问题会给系统带来灾难性的影响
2.6 MySQL用户及权限
MySQL用户及权限
MySQL的用户及权限,相对于Oracle而言,灵活太多。
user@ip1与user@ip2是不同的用户,密码可以相同也可以不同,权限可以相同也可以不同。
而且权限细分得比较多,对于授权而言更为灵活。
2.7 MySQL数据类型
MySQL数据类型
MySQL的数据类型,对于DBA而言非常重要,随着云平台的兴起,部分DBA的工作已经被自动化了,更多的DBA开始熟悉业务,参与系统架构相关。
越来越多的系统也由更懂数据库存储,数据结构的DBA来设计。
2.8 MySQL数据库、表、索引相关命令
MySQL数据库相关操作
MySQL表相关操作
MySQL索引相关操作
这些命令DBA要记在心里,如果开发的问过来还得通过百度来查找,那样会有点丢脸哦
2.9 MySQL事务和锁
MySQL事务
MySQL锁
事务和锁是关系型数据库的核心,不同关系型数据库的实现方式都不同。
对于DBA及自身的开发人员,需要懂得自己用的每一种数据库的锁机制,这样才能设计出更好的系统。
从Oracle、SQL Server转到MySQL的DBA,经常被一些莫名其妙的MySQL给困扰,作为MySQLDBA,我也经常和架构师、开发组长一起排查生产环境的各种锁,想办法去优化各种锁。
2.10 MySQL常用的存储引擎
MySQL常用的存储引擎
MySQL的存储引擎是MySQL的一个独特优势,相较于其它关系型数据库而言,更为灵活。
之前遇到过公司的购买的某系统,供应商的软件,mysql用的存储引擎是MyISAM,每次停电或者异常关机,都需要DBA去手工执行修复表的命令,不然库都启动不起来。
Innodb已经越来越强大,MySQL 8.0开始,Innodb已经是MySQL系统表的存储引擎,也是MySQL建表的默认存储引擎,祝愿MySQL发展越来越好。
2.11 MySQL的备份和恢复
MySQL逻辑备份mysqldump
MySQL 8.0 物理备份xtrabackup
MySQL 5.6 xtrabackup
MySQL 二进制日志binlog
MySQL 工具之mysqldumper
MySQL 数据恢复工具之binlog2sql
MySQL数据恢复工具之MyFlash
DBA工作的核心之一就是保障数据的安全。
MySQL的备份恢复对于DBA而言是重中之重,数据丢失会给企业带来灾难性的影响。
2020年初的微盟事件,让公司的市场份额被竞争对手抢去,给公司发展带来了灾难性的影响。
DBA生涯中,经常遇到权限管控不严格,开发误删数据,或产品页面配置错误,需要找DBA进行数据恢复。
DBA必须制定一套数据库备份、容灾的体系,模拟任何异常情况带来的数据丢失场景的数据恢复。
DBA必须熟悉市面上流行的各种数据备份、恢复、日志挖掘的工具的应用。
DBA必须在遇到异常情况下,保持一颗大心脏,胆大、心细,尽一切可能降低企业的损失。
2.12 MySQL高可用
MySQl主从搭建
MySQL 8.0 半同步复制
MySQL 8.0 GTID复制
MySQL 8.0 延迟复制
MySQL MGR单主模式搭建
MySQL MGR 联机配置
MySQL主从高可用之Keepalived
MySQL MHA高可用实战
DBA工作的核心之一是保障数据库的高可用。
随着信息化的不断深入,人们对于信息系统的依赖性越来越高。往往信息系统的不可用会给人们的生活带来诸多不便利,甚至会严重影响到人们的生产和生活。
对于DBA而言,要部署高可用的数据库系统架构,指导开发合理的使用数据库,定期优化数据库,保障数据库持续对外输出服务。
2.13 MySQL 运维管理工具–pt(Percona-toolkit)
MySQL 运维管理工具–pt(Percona-toolkit)
pt是percona开发的运维管理工具,大大方便了DBA的工作,建议MySQL DBA都熟悉下pt工具,优化自身的运维工作。
2.14 MySQL 监控软件lepus天兔
MySQL 监控软件lepus天兔
监控是运维的一个重点,监控主机、监控数据库、监控网络、监控存储,遇到问题早发现,早处理。
lepus是国内开发人员用php开发的一个开源的数据库监控系统,界面友好,功能强大,相较于zabbix而言,更轻量。建议MySQL DBA可以支持lepus这个项目。