![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 72
AllenGd
人生之奋斗,其苦无穷,其乐无穷。
展开
-
MySQL TIMESTAMP 不能为NULL
3、DATETIME列可以变相的设定默认值,比如通过触发器、或者在插入数据时候,将DATETIME字段值设置为now(),这样可以做到了,尤其是后者,在程序开发中常常用到。这个语句含义,a字段的默认值是CURRENT_TIMESTAMP,当纪录更新时候,自动将a字段的值设置为 CURRENT_TIMESTAMP。6、另外,下面的定义从语法角度是对的,但是没有意义,因为该字段的值不可更改,永远只能为默认值。相反,要注意的问题是,编程语言对日期范围的限制,不同的语言,有不同的限制,这里不做讨论了。原创 2023-10-18 09:42:19 · 769 阅读 · 0 评论 -
MySQL原理探索——31 误删数据后除了跑路,还能怎么办
在前面几篇文章中,介绍了 MySQL 的高可用架构。当然,传统的高可用架构是不能预防误删数据的,因为主库的一个 drop table 命令,会通过 binlog 传给所有从库和级联从库,进而导致整个集群的实例都会执行这个命令。虽然我们之前遇到的大多数的数据被删,都是运维同学或者 DBA 背锅的。但实际上,只要有数据操作权限的同学,都有可能踩到误删数据这条线。今天我们就来聊聊误删数据前后,我们可以做些什么,减少误删数据的风险,和由误删数据带来的损失。原创 2023-07-18 16:24:45 · 119 阅读 · 0 评论 -
MySQL原理探索——30 答疑文章(二):用动态的观点看加锁
在第20和21篇文章中,介绍了 InnoDB 的间隙锁、next-key lock,以及加锁规则。今天这篇答疑文章的主题,即:用动态的观点看加锁。为了方便理解,我们再一起复习一下加锁规则。这个规则中,包含了两个“原则”、两个“优化”和一个“bug”:原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。原则 2:查找过程中访问到的对象才会加锁。原创 2023-07-12 09:53:04 · 135 阅读 · 0 评论 -
MySQL原理探索——29 如何判断一个数据库是不是出问题了
在第25和27篇文章中,介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。主备切换有两种场景,一种是主动切换,一种是被动切换。而其中被动切换,往往是因为主库出问题了,由 HA 系统发起的。这也就引出了我们今天要讨论的问题:怎么判断一个主库出问题了?你一定会说,这很简单啊,连上 MySQL,执行个 select 1 就好了。原创 2023-07-11 09:44:43 · 166 阅读 · 0 评论 -
MySQL原理探索——28 读写分离有哪些坑
在上一篇文章中,介绍了一主多从的结构以及切换流程。今天我们就继续聊聊一主多从架构的应用场景:读写分离,以及怎么处理主备延迟导致的读写分离问题。我们在上一篇文章中提到的一主多从的结构,其实就是读写分离的基本结构了。这里,我再把这张图贴过来,方便你理解。读写分离的主要目标就是分摊主库的压力。图 1 中的结构是客户端(client)主动做负载均衡,这种模式下一般会把数据库的连接信息放在客户端的连接层。也就是说,由客户端来选择后端数据库进行查询。原创 2023-07-10 15:15:10 · 324 阅读 · 0 评论 -
MySQL原理探索——27 主库出问题了,从库怎么办
在前面的第24、25和26篇文章中,介绍了 MySQL 主备复制的基础结构,但这些都是一主一备的结构。大多数的互联网应用场景都是读多写少,因此你负责的业务,在发展过程中很可能先会遇到读性能的问题。而在数据库层解决读性能问题,就要涉及到接下来两篇文章要讨论的架构:一主多从。今天这篇文章,我们就先聊聊一主多从的切换正确性。然后,我们在下一篇文章中再聊聊解决一主多从的查询逻辑正确性的方法。如图 1 所示,就是一个基本的一主多从结构。原创 2023-07-10 14:42:56 · 316 阅读 · 0 评论 -
MySQL原理探索——26 备库为什么会延迟好几个小时
在上一篇文章中,介绍了几种可能导致备库延迟的原因。你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来。但是,如果备库执行日志的速度持续低于主库生成日志的速度,那这个延迟就有可能成了小时级别。而且对于一个压力持续比较高的主库来说,备库很可能永远都追不上主库的节奏。这就涉及到今天我要给你介绍的话题:备库并行复制能力。为了便于你理解,我们再一起看一下第 24 篇文章《MySQL 是怎么保证主备一致的?》的主备流程图。原创 2023-07-10 14:08:13 · 268 阅读 · 0 评论 -
MySQL原理探索——25 MySQL是怎么保证高可用的
在上一篇文章中,介绍了 binlog 的基本内容,在一个主备关系中,每个备库接收主库的 binlog 并执行。正常情况下,只要主库执行更新生成的所有 binlog,都可以传到备库并被正确地执行,备库就能达到跟主库一致的状态,这就是最终一致性。但是,MySQL 要提供高可用能力,只有最终一致性是不够的。为什么这么说呢?今天就着重分析一下。这里,我再放一次上一篇文章中讲到的双 M 结构的主备切换流程图。原创 2023-07-04 10:24:29 · 214 阅读 · 0 评论 -
MySQL原理探索——20幻读
20 幻读是什么?幻读会造成什么后果?在上一篇文章最后,遗留了一个关于加锁规则的问题。今天,我们就从这个问题说起。为了便于说明问题,这篇文章,我们就先使用一个小一点的表。这个表除了主键 id 外,还有一个索引 c,初始化语句在表中插入了 6 行数据。上期的问题是,下面的语句序列,是怎么加锁的,加的锁又是什么时候释放的呢?原创 2023-07-03 15:13:00 · 259 阅读 · 0 评论 -
MySQL原理探索——21 为什么我只改一行的语句,锁这么多
在上一篇文章中,介绍了间隙锁和 next-key lock 的概念,但是并没有说明加锁规则。间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上犯错。所以,我们就先从这个加锁规则开始吧。首先说明一下,这些加锁规则我没在别的地方看到过有类似的总结,以前我自己判断的时候都是想着代码里面的实现来脑补的。这次为了总结成不看代码的同学也能理解的规则,是我又重新刷了代码临时总结出来的。原创 2023-07-03 15:59:31 · 106 阅读 · 0 评论 -
MySQL原理探索——22 MySQL有哪些“饮鸩止渴”提高性能的方法
不知道你在实际运维过程中有没有碰到这样的情景:业务高峰期,生产环境的 MySQL 压力太大,没法正常响应,需要短期内、临时性地提升一些性能。我做项目的时候,就偶尔会碰上这种场景。用户的开发负责人说,不管你用什么方案,让业务先跑起来再说。但,如果是无损方案的话,肯定不需要等到这个时候才上场。今天我们就来聊聊这些临时方案,并着重说一说它们可能存在的风险。原创 2023-07-03 16:30:20 · 365 阅读 · 0 评论 -
MySQL原理探索——24 MySQL是怎么保证主备一致的
在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。毫不夸张地说,MySQL 能够成为现下最流行的开源数据库,binlog 功不可没。在最开始,MySQL 是以容易学习和方便的高可用架构,被开发人员青睐的。而它的几乎所有的高可用架构,都直接依赖于 binlog。原创 2023-07-04 09:49:55 · 622 阅读 · 0 评论 -
MySQL原理探索——23 MySQL是怎么保证数据不丢的
今天这篇文章,我会继续介绍在业务高峰期临时提升性能的方法。从文章标题“MySQL 是怎么保证数据不丢的”,你就可以看出来,今天我介绍的方法,跟数据的可靠性有关。在前面文章,我都着重介绍了 WAL 机制(你可以再回顾下第 2 篇、第 9 篇、第 12 篇和第 15 篇文章中的相关内容),得到的结论是:只要 redo log 和 binlog保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢复。有同学问,redo log 的写入流程是怎么样的,如何保证 redo log 真实地写入了磁盘。原创 2023-07-04 09:09:02 · 259 阅读 · 0 评论 -
sql查询不以某些指定字符开头(正则表达式)
我们用到的最多的是:查询以特定字符或字符串开头的记录字符^用来匹配以特定字符或字符串开头的记录。查询不以某些指定字符开头,使用NOT REGEXP来解决。原创 2023-02-15 15:00:51 · 3830 阅读 · 0 评论 -
MySQL自定义函数应用
【代码】MySQL自定义函数应用。原创 2022-12-16 11:16:25 · 153 阅读 · 0 评论 -
在问答里面看到得两道MySQL题
【代码】在问答里面看到得两道MySQL题。原创 2022-12-02 13:52:25 · 571 阅读 · 1 评论 -
将图片存进mysql数据库
正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,本篇博客记录如何将图片存进mysql数据库,如果要图片存进数据库,要将图片转化成二进制。场景:前端页面要展现公司、商铺信息,其中包括公司logo、商铺图片。1.数据库存储图片的字段类型要为blob二进制大对象类型。2、`photo`字段类型一定要足够大,不然会报错。2.将图片流转化为二进制 下面放上代码实例。我这里使用的数据库工具是:DBeaver。1、记得添加MySQL驱动包。原创 2022-11-17 17:06:42 · 9077 阅读 · 5 评论 -
MySQL8.0以下版本使用ROW_NUMBER() OVER (<partition_definition> <order_definition>)实现组内排序
场景:mysql如何按多列进行写入标签列,MySQL8.0版本才有ROW_NUMBER() OVER ( ) 这个函数,但又想实现同样的功能,5.x需要另一种写法。原创 2022-11-03 19:48:34 · 2091 阅读 · 0 评论 -
MySQL求和SUM()结果为整数类型在kettle结果显示为小数
DATETIME 将value转换成'YYYY-MM-DD HH:MM:SS'格式。AS关键字用于分隔两个参数,在AS之前的是要处理的数据,在AS之后的是要转换的数据类型。CHAR 将value转换成CHAR(固定长度的字符串)格式。TIME 将value转换成'HH:MM:SS'格式。SIGNED 将value转换成INT(有符号的整数)格式。UNSIGNED 将value转换成INT(无符号的整数)格式。原创 2022-11-02 17:41:02 · 1009 阅读 · 0 评论 -
MySQL案例
1、组合两个表 left join表1: Person+-------------+---------+| 列名 | 类型 |+-------------+---------+| PersonId | int || FirstName | varchar || LastName | varchar |+-------------+---------+PersonId 是上表主键表2: Address+-------------+--......原创 2021-03-08 17:26:54 · 1183 阅读 · 0 评论 -
部门工资前三高的所有员工
Employee表包含所有员工信息,每个员工有其对应的工号Id,姓名Name,工资Salary和部门编号DepartmentId。Department表包含公司所有部门的信息。编写一个SQL 查询,找出每个部门获得前三高工资的所有员工。例如,根据上述给定的表,查询结果应返回:解释:IT 部门中,Max 获得了最高的工资,Randy 和 Joe 都拿到了第二高的工资,Will 的工资排第三。销售部门(Sales)只有两名员工,Henry 的工资最高,Sam 的工资...原创 2021-03-05 10:49:41 · 945 阅读 · 4 评论 -
连续出现的数字
表:logs编写一个 SQL 查询,查找所有至少连续出现三次的数字。返回的结果表中的数据可以按任意顺序排列。查询结果格式如下面的例子所示:解法一:使用窗口函数的偏差函数完美实现。 可以这样理解:将num复制两列num1和num2,然后num1整体向上移动一行,num2整体向上移动两行,如下 :所以只要num=num1=num2即可.select distinct num as ConsecutiveNums from( select num,lead..原创 2021-03-04 14:32:42 · 529 阅读 · 2 评论 -
SQL面试题:经典排名问题(相同分数是否要并列,排名是否有间隔)
【题目】下图是"班级"表中的内容,记录了每个学生所在班级,和对应的成绩。现在需要按成绩来排名,如果两个分数相同,那么排名要是并列的。正常排名是1,2,3,4,但是现在前3名是并列的名次,排名结果是:1,1,1,2。【解题思路】1.涉及到排名问题,可以使用窗口函数2.专用窗口函数rank, dense_rank, row_number有什么区别呢?它们的区别我举个例子,你们一下就能看懂:select *, rank() over (order by 成绩 desc)原创 2021-03-04 14:03:02 · 2958 阅读 · 4 评论 -
MySQL给用户添加某个数据库的权限、ERROR1819 (HY000): Your password does not satisfy the current policy requirements
一、ERROR 1819 (HY000): Your password does not satisfy the current policy requirements原因是因为密码设置的过于简单会报错,MySQL有密码设置的规范,具体是与validate_password_policy的值有关,下图表明该值规则:如果想要查看MySQL完整的初始密码规则,登陆后执行以下命令:SHOW VARIABLES LIKE 'validate_password%';密码的长度是由valid原创 2020-11-16 14:32:34 · 1050 阅读 · 0 评论 -
MySQL DROP表卡死解决方案
场景:同事要删除一张表,数据量3308条,数据量不大,但drop表,一直卡着。。。。。。分析:MySQL如果频繁的修改一个表的数据,那么这么表会被锁死。造成假死现象。解决:1.首先执行:show full processlist; //列出当前的操作process,一般会看到很多waiting的process,说明已经有卡住的proces了,我们要杀死这些process!!2.再执行:kill processid; //processid表示process的id,比如kill..原创 2020-11-13 16:47:55 · 6798 阅读 · 0 评论 -
零散的MySQL基础——SQL命令:DDL、DML、DCL和TCL
最近出差比较多,所以没来得及更新。今天来聊一聊零散的MySQL基础——SQL命令:DDL、DML、DCL和TCL。SQL命令SQL命令分可以分为四组:DDL、DML、DCL和TCL。四组中包含的命令分别如下(图片来源见水印)DDLDDL是数据定义语言(Data Definition Language)的简称,它处理数据库schemas和描述数据应如何驻留在数据库中。 CREATE:创建数据库及其对象(如表,索引,视图,存储过程,函数和触发器) ALTER:改变现有数据原创 2020-09-22 16:50:40 · 233 阅读 · 0 评论 -
MySQL三大日志-binlog、redo log和undo log
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。作为开发,我们重点需要关注的是二进制日志(binlog)和事务日志(包括redo log和undo log),本文接下来会详细介绍这三种日志。binlogbinlog用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。binlog是mysql的逻辑日志,并且由Server层进行记录,使用任何存储...原创 2020-09-15 09:36:05 · 148 阅读 · 0 评论 -
MySQL原理探索——19 为什么我只查一行的语句,也执行这么慢
19 为什么我只查一行的语句,也执行这么慢一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据。但有些情况下,“查一行”,也会执行得特别慢。今天,聊聊这个有趣的话题,看看什么情况下,会出现这个现象。需要说明的是,如果 MySQL 数据库本身就有很大的压力,导致数据库服务器 CPU 占用率很高或 ioutil(IO 利用率)很高,这种情况下所有语句的执行都有可能变慢,不属于我们今天的讨论范围。为了便于描述,我还是构造一个表,基于这个表来说明今天的问题。这个表原创 2020-08-07 15:13:45 · 278 阅读 · 0 评论 -
MySQL原理探索——18 为什么这些SQL语句逻辑相同,性能却差异巨大
18 为什么这些SQL语句逻辑相同,性能却差异巨大在MySQL中,有很多看上去逻辑相同,但性能却差异巨大的SQL语句。对这些语句使用不当的话,就会不经意间导致整个数据库的压力变大。今天挑选了三个这样的案例和你分享。希望再遇到相似的问题时,你可以做到举一反三、快速解决问题。案例一:条件字段函数操作假设你现在维护了一个交易系统,其中交易记录表tradelog包含交易流水号(tradeid)、交易员id(operator)、交易时间(t_modified)等字段。为了便于描述,我们先忽略其他字段。原创 2020-08-07 14:44:37 · 236 阅读 · 0 评论 -
MySQL原理探索——17 如何正确地显示随机消息
17 如何正确地显示随机消息我在上一篇文章,讲解完order by语句的几种执行模式后,就想到了之前一个做英语学习App的朋友碰到过的一个性能问题。今天这篇文章,就从这个性能问题说起,说说MySQL中的另外一种排序需求,希望能够加深你对MySQL排序逻辑的理解。这个英语学习App首页有一个随机显示单词的功能,也就是根据每个用户的级别有一个单词表,然后这个用户每次访问首页的时候,都会随机滚动显示三个单词。他们发现随着单词表变大,选单词这个逻辑变得越来越慢,甚至影响到了首页的打开速度。现在,如果让你原创 2020-08-07 14:24:47 · 222 阅读 · 0 评论 -
MySQL原理探索——16 order by是怎么工作的
16 order by是怎么工作的?在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求。还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前1000个人的姓名、年龄。假设这个表的部分定义是这样的:CREATE TABLE `t` (`id` int(11) NOT NULL,`city` varchar(16) NOT NULL,`name` varchar(16) NOT NULL,`age` int(11)原创 2020-08-07 13:54:32 · 180 阅读 · 0 评论 -
MySQL原理探索——15 答疑文章(一):日志和索引相关问题
15 答疑文章(一):日志和索引相关问题日志相关问题我在第2篇文章《日志系统》中,讲到binlog(归档日志)和redo log(重做日志)配合崩溃恢复的时候,用的是反证法,说明了如果没有两阶段提交,会导致MySQL出现主备数据不一致等问题。那么,在两阶段提交的不同瞬间,MySQL如果发生异常重启,是怎么保证数据完整性的?现在,我们就从这个问题开始吧。我再放一次两阶段提交的图,方便学习下面的内容。图1 两阶段提交示意图这里,我要先和你解释一个误会式的问题。有同学在问到,这个图原创 2020-08-07 13:41:28 · 245 阅读 · 0 评论 -
MySQL原理探索——14 count(*)这么慢,我该怎么办
14 count(*)这么慢,我该怎么办在开发系统的时候,你可能经常需要计算一个表的行数,比如一个交易系统的所有变更记录总数。这时候你可能会想,一条select count(*) from t 语句不就解决了吗?但是,你会发现随着系统中记录数越来越多,这条语句执行得也会越来越慢。然后你可能就想了,MySQL怎么这么笨啊,记个总数,每次要查的时候直接读出来,不就好了吗。那么,我们就来聊聊count(*)语句到底是怎样实现的,以及MySQL为什么会这么实现。然后,如果应用中有这种频繁变更并需要统计表原创 2020-08-07 13:33:55 · 195 阅读 · 0 评论 -
MySQL原理探索——13 为什么表数据删掉一半,表文件大小不变
13 为什么表数据删掉一半,表文件大小不变经常会有同学来问我,我的数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?那么今天,就聊聊数据库表的空间回收,看看如何解决这个问题。这里,我们还是针对MySQL中应用最广泛的InnoDB引擎展开讨论。一个InnoDB表包含两部分,即:表结构定义和数据。在MySQL 8.0版本以前,表结构是存在以.frm为后缀的文件里。而MySQL 8.0版本,则已经允许把表结构定义放在系统数据表中了。因为表结构定义占用的空间很小,所以我们今原创 2020-08-07 13:29:23 · 369 阅读 · 0 评论 -
MySQL原理探索——12 为什么我的MySQL会“抖”一下
12 为什么我的MySQL会“抖”一下平时的工作中,不知道你有没有遇到过这样的场景,一条 SQL 语句,正常执行的时候特别 快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。看上去,这就像是数据库“抖”了一下。今天,我们就一起来看一看这是什么原因。你的 SQL 语句为什么变“慢”了在前面第 2 篇文章《日志系统》中,介绍了 WAL 机制。现在你知道了,InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo原创 2020-08-07 13:25:56 · 175 阅读 · 0 评论 -
MySQL原理探索——11 怎么给字符串字段加索引
11 怎么给字符串字段加索引现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题。假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的:mysql> create table SUser( ID bigint unsigned primary key, email varchar(64), ... )engine=innodb;由于要使用邮箱登录,所以业务代码中一定会出现类似于这样的语句:mysql> select f1, f原创 2020-08-07 13:17:41 · 281 阅读 · 0 评论 -
mysql中explain的type的解释
导语:很多情况下,有很多人用各种select语句查询到了他们想要的数据后,往往便以为工作圆满结束了。当一个sql查询语句被写出来之后,其实你的工作只完成了一小半,接下来更重要的工作是评估你自己写的sql的质量与效率。mysql为我们提供了很有用的辅助武器explain,它向我们展示了mysql接收到一条sql语句的执行计划。根据explain返回的结果我们便可以知道我们的sql写的怎么样,是否会造成查询瓶颈,同时根据结果不断的修改调整查询语句,从而完成sql优化的过程。虽然 explain返原创 2020-08-05 13:51:43 · 5052 阅读 · 0 评论 -
MySQL数据库框架
链接:https://pan.baidu.com/s/1q66fsVYtmgjGynQCKW9siA提取码:pwoy原创 2020-07-31 13:59:23 · 413 阅读 · 6 评论 -
MySQL原理探索——10 MySQL为什么有时候会选错索引
10 MySQL为什么有时候会选错索引前面介绍过索引,你已经知道了在 MySQL 中一张表其实是可以支持多个索引的。但是,你写 SQL 语句的时候,并没有主动指定使用哪个索引。也就是说,使用哪个索引是由 MySQL 来确定的。不知道你有没有碰到过这种情况,一条本来可以执行得很快的语句,却由于 MySQL 选错了索引,而导致执行速度变得很慢?我们一起来看一个例子吧。我们先建一个简单的表,表里有 a、b 两个字段,并分别建上索引:CREATE TABLE `t` ( `id` int(.原创 2020-07-23 15:44:02 · 287 阅读 · 0 评论 -
MySQL原理探索——09 普通索引和唯一索引,应该怎么选择
09 普通索引和唯一索引,应该怎么选择在前面的基础篇文章中,介绍过索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈,在不同的业务场景下,应该选择普通索引,还是唯一索引?假设你在维护一个市民系统,每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的 SQL 语句:select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';所原创 2020-07-23 15:35:52 · 157 阅读 · 0 评论