随笔分类 - MySQL数据库
摘要:> 以下内容出自 《MySQL 实战 45 讲》 # 24 | MySQL是怎么保证主备一致的? ## MySQL 主备的基本原理 如图所示就是基本的主备切换流程。(M-S结构) ![image](https://img2023.cnblogs.com/blog/1371486/202307/137
阅读全文
摘要:> 以下内容出自《MySQL 实战 45 讲》 # 23 | MySQL是怎么保证数据不丢的? ## binlog 的写入机制 1、事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中。 2、一个事务的 binlog 是不
阅读全文
摘要:> 以下内容出自 《MySQL 实战 45 讲》 # 21 | 为什么我只改一行的语句,锁这么多? ## 加锁规则 **原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。** **原则 2:查找过程中访问到的对象才会加锁。** **优化 1:索引上的
阅读全文
摘要:> 以下内容出自 《MySQL 实战 45 讲》 # 19 | 为什么我只查一行的语句,也执行这么慢? ## 第一类:查询长时间不返回 ```mysql mysql> select * from t where id=1; ``` 一般碰到这种情况。大概率是表 t 被锁住了。 分析: 首先执行 `s
阅读全文
摘要:# 16 | “order by”是怎么工作的? ## 前置 MySQL 会给每个线程分配一块内存用于排序,称为 sort_buffer。 排序时可能在内存中完成,也可能需要使用外部排序,这取决于排序所需的内存和参数 sort_buffer_size 。 sort_buffer_size,就是 My
阅读全文
摘要:> 一下内容出自《MySQL 实战 45 讲》 ## 14 | count(*)这么慢,我该怎么办? ### count(*) 的实现方式 不同的 MySQL 引擎中,count(*) 有不同的实现方式。 - MyISAM 引擎把一个表的总行数存在了磁盘上,执行 count(\*) 的时候会直接返回
阅读全文
摘要:## 13 | 为什么表数据删掉一半,表文件大小不变? ### 参数 innodb_file_per_table 表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的: - ON 表示的是,每个 InnoDB 表数据存储在一个以 .i
阅读全文
摘要:> 一下内容出自 《MySQL 实战 45 讲》 ## 12 | 为什么我的MySQL会“抖”一下? 一条 SQL 语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。看上去,这就像是数据库“抖”了一下。 这个时候,MySQ
阅读全文
摘要:> 以下出自《MySQL 实战 45 讲》 ## 11 | 怎么给字符串字段加索引? 1、直接创建完整索引,这样可能比较占用空间; 2、创建前缀索引,节省空间,但会增加查询扫描次数,并且**不能使用覆盖索引**; 3、倒序存储,再创建前缀索引,用于绕过字符串本身前缀的区分度不够的问题; 4、创建 h
阅读全文
摘要:> 以下内容出自《MySQL 实战 45 讲》 ## 10 | MySQL为什么有时候会选错索引? ### 优化器的逻辑 选择索引是优化器的工作。 影响优化器选择的判断标准: - 扫描行数 - 临时表 - 是否排序 #### 扫描行数 MySQL 在真正执行语句之前,会根据统计信息来估算记录数。这个
阅读全文
摘要:> 以下内容出自《MySQL 实战 45 讲》 ## 09 | 普通索引和唯一索引,应该怎么选择? ### 查询过程 性能差距:微乎其微。 InnoDB 的数据是按数据页(默认为 16KB)为单位来读写的。对于普通索引,因为符合条件的行附近的行也在这个页中,所以查找附近的行只需要在内存中操作,会很快
阅读全文
摘要:## 08 | 事务到底是隔离的还是不隔离的? ### 事务启动时机 事务启动时机: begin/start transaction 命令并不是一个事务的起点,在执行到它们之后的第一个操作 InnoDB 表的语句,事务才真正启动。如果想要马上启动,可以使用 start transaction wit
阅读全文
摘要:## 06、07 | 全局锁、表锁和行锁 MySQL 中的锁大致分为全局锁、表锁和行锁。 ### 全局锁 全局锁就是对整个数据库实例加锁。 加全局锁命令:`Flush tables with read lock`(FTWRL),执行该命令会让整个库处于只读状态。 ```sql Flush table
阅读全文
摘要:## 04 | 05 深入浅出索引 在 MySQL 中,索引是在存储引擎层实现的,所以并没有统一的索引标准,即不同存储引擎的索引的工作方式并不一样。而即使多个存储引擎支持同一种类型的索引,其底层的实现也可能不同。 ### 索引常见模型 | 模型 | 特点 | 场景 | 使用 | | | | | |
阅读全文
摘要:## 03 | 事务隔离:为什么你改了我还看不见? ### 隔离性与隔离级别 当数据库上有多个事务同时执行的时候,就可能出现**脏读(dirty read)**、不可重复读(non-repeatable read)、**幻读(phantom read)**的问题,为了解决这些问题,就有了“隔离级别”
阅读全文
摘要:> 以下内容出自《MySQL 实战 45 讲》 ## 02 | 日志系统:一条SQL更新语句是如何执行的? 查询语句的那套流程,更新语句也会走一遍。 更新流程中和查询不一样的是,更新流程中涉及了两个重要的日志模块。`redo log` (重做日志) 和 `binglog`(归档日志)。 ### re
阅读全文
摘要:## 基础篇 ### 第一课、一条 SQL 查询语句是如何执行的? 下面是 MySQL 的基本架构示意图,从中可以清楚地看到 SQL 语句在 MySQL 的各个功能模块中的执行过程。 ![MySQL 的基本架构示意图](https://cdn.jsdelivr.net/gh/YangZhiqiang
阅读全文
摘要:触发器 触发器概念 基本概念 触发器是一种特殊类型的存储过程,它不同于存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通够存储过程名字而被直接调用。 触发器:trigger,是一种非常接近于js中的事件的知识,提前给某张表的所有记录绑定一段代码,如果该行的操作满足条件(触发),这段提
阅读全文
摘要:存储过程 存储过程的概念 存储过程(stored procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,(效率比较高)用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对
阅读全文
摘要:变量作用域 变量作用域:变量能够使用的区域范围 局部作用域 使用declare关键字声明(在结构体内:函数/存储过程/触发器),而且只能在结构体内部使用。 declare关键字声明的变量没有任何符号修饰,就是普通字符串,如果在外部能够访问该变量,系统会自动认为是字段。 会话作用域 用户定义的:使用@
阅读全文