MySQL高级
文章平均质量分 89
猿小羽
技术本身是不值钱的,只有和业务结合的技术才是值钱的!
技术是为了实现某个业务,进而通过业务赚钱!
展开
-
MySQL八股
flush 阶段第一个事务会成为flush阶段的 Leader,此时后面到来的事务都是 Follower :接着,获取队列中的事务组,由绿色事务组的 Leader 对 rodo log 做一次 write + fsync,即一次性将同组事务的 redo log 刷盘:完成了 prepare 阶段后,将绿色这一组事务执行过程中产生的 binlog 写入 binlog 文件(调用 write,不会调用 fsync,所以不会刷盘,binlog 缓存在操作系统的文件系统中)。从上面这个过程,可以知道。原创 2022-11-11 11:32:38 · 892 阅读 · 0 评论 -
第二十二章 MySQL有哪些“饮鸩止渴”提高性能的方法?
第二十二章 MySQL有哪些“饮鸩止渴”提高性能的方法?短连接风暴在想要短期提高数据库性能的情况下,为什么说可以对短连接进行一些处理 ?因为连接过程中,权限收集和校验是比较耗性能的在高频短连接访问数据库的情况下,想要短期业务无损地提高服务器性能,怎么做 ?将 max_connections 设置为合理的参数,因为超过这个连接数的连接会被拒绝,但过大的话,连接了的线程又拿不到 CPU 资源去执行其次,即使是空闲的线程只要保持连接也会占用一个 connection 位置,所以 kill 掉原创 2022-03-21 16:12:25 · 559 阅读 · 0 评论 -
第二十三章 MySQL是怎么保证数据不丢的?
第二十三章 MySQL是怎么保证数据不丢的?MySQL 能够保证数据不丢失的根据是什么 ?根据 WAL 机制,只要 redo log 和 binlog 能保证持久化到磁盘,就能保证数据不丢失binlog 的写入机制binlog 是怎么写入磁盘的 ?事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中事务执行过程中,每个线程会分配得到一片 binlog cache,由参数 binlog_cache_size 控原创 2022-03-21 16:10:35 · 1535 阅读 · 0 评论 -
第二十一章 为什么我只改一行的语句,锁这么多?
第二十一章 为什么我只改一行的语句,锁这么多?简单介绍一下 next-key lock 的加锁规则 ?两个原则、两个优化、一个 bug原则:加锁的基本单位是 next-key lock(前开后闭)原则:查询过程中访问到的对象才会加锁(首先是 where 的索引对象,其次是 select 的索引对象)优化:索引上的等值查询,如果是唯一索引,next-key lock 会退化为 行锁优化:索引上的等值查询,向右遍历时且最后一个值不满足等值条件 的时候,next-key lock 退化为 间原创 2022-03-20 22:33:33 · 153 阅读 · 4 评论 -
第二十章 幻读是什么,幻读有什么问题?
第二十章 幻读是什么,幻读有什么问题?CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `c` (`c`)) ENGINE=InnoDB;insert into t values(0,0,0),(5,5,5),(10,10,10),(15,15,15),(20,20,20),(25,25,25)原创 2022-03-19 18:22:25 · 1594 阅读 · 4 评论 -
第十九章 为什么我只查一行的语句,也执行这么慢?
第十九章 为什么我只查一行的语句,也执行这么慢?查询长时间不返回一条查询语句始终无返回,可能是因为什么原因导致的 ?可能在等待 MDL 锁 释放查询语句执行时申请的是 MDL 读锁,若之前有 MDL 写锁 处于申请中或正持有中,则MDL 读锁 等待可能在等待 flush 锁(在第六章讲过 flush tables with read lock 会加全局读锁)执行 flush statement 类语句可能发生锁等待,其中:flush tables with read lock:原创 2022-03-19 11:56:32 · 185 阅读 · 0 评论 -
第十八章 为什么这些SQL语句逻辑相同,性能却差异巨大?
第十八章 为什么这些SQL语句逻辑相同,性能却差异巨大?什么情况下可能导致索引失效 ?索引字段手动的函数操作隐式类型转换隐式字符编码转换等条件字段函数操作索引字段手动函数操作下,什么情况会发生索引失效,怎么解决,举一个例子说明一下 ?CREATE TABLE `tradelog` ( `id` int(11) NOT NULL, `tradeid` varchar(32) DEFAULT NULL, `operator` int(11) DEFAULT NULL,原创 2022-03-18 21:36:02 · 519 阅读 · 0 评论 -
第十六章 “order by”是怎么工作的?
第十六章 “order by”是怎么工作的?全字段排序CREATE TABLE `t` ( `id` int(11) NOT NULL, `city` varchar(16) NOT NULL, `name` varchar(16) NOT NULL, `age` int(11) NOT NULL, `addr` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`), KEY `city` (`city`)) ENGINE=InnoDB原创 2022-03-18 10:12:01 · 288 阅读 · 5 评论 -
第十五章 日志和索引相关问题
第十五章 日志和索引相关问题日志相关问题两阶段提交示意图如果崩溃发生在时刻 A如果在图中时刻 A 的地方,也就是写入 redo log 处于 prepare 阶段之后、写 binlog 之前,发生了崩溃(crash),由于此时 binlog 还没写,redo log 也还没提交,所以崩溃恢复的时候,这个事务会回滚。这时候,binlog 还没写,所以也不会传到备库。如果崩溃发生在时刻 B崩溃恢复时的判断规则:如果 redo log 里面的事务是完整的,也就是已经有了 com原创 2022-03-17 23:42:04 · 345 阅读 · 0 评论 -
第十四章 count(*)这么慢,我该怎么办?
第十四章 count(*)这么慢,我该怎么办?count(*) 的实现方式在不同的 MySQL 引擎中,count(*) 有不同的实现方式:MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢 ?和 InnoDB 的事务设计有关系,可重复读是它默认的原创 2022-03-17 15:50:17 · 755 阅读 · 0 评论 -
第十三章 为什么表数据删掉一半,表文件大小不变 ?
第十三章 为什么表数据删掉一半,表文件大小不变 ?参数 innodb_file_per_table表数据既可以存在共享表空间里,也可以是单独的文件。这个行为是由参数 innodb_file_per_table 控制的:OFF:表的数据放在系统共享表空间,也就是跟数据字典放在一起ON:每个 InnoDB 表数据存储在一个以 .ibd 为后缀的文件中建议将这个值设置为:ON如果把一个表单独放在一个文件里,通过 drop table 命令,系统就会直接删除这个文件如果把一个表放在共享表空间中原创 2022-03-17 13:13:20 · 581 阅读 · 3 评论 -
第九章 普通索引和唯一索引
第九章 普通索引和唯一索引查询过程普通索引 和 唯一索引 在执行上的区别 ?普通索引的等值查询,会继续遍历到第一个不相等的值才会结束唯一索引的等值查询,命中则结束(性能差距微乎其微)InnoDB 的数据是按数据页为单位来读写的当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存在 InnoDB 中,每个数据页的大小默认是 16KB读取数据页分为两种情况:要查询的记录不在页尾,则只需要读取当前记录所在的数据页即可要查询的记录在页尾,则在原创 2022-03-14 15:47:37 · 847 阅读 · 0 评论 -
第八章 事务隔离还是不隔离
第八章 事务隔离还是不隔离Innodb支持 RC(读提交) 和 RR(可重复读) 隔离级别实现是用的一致性视图(consistent read view)事务的启动时机begin/start transaction:一致性视图是在执行第一个快照读语句时创建的start transaction with consistent snapshot:一致性视图是在执行 start transaction with consistent snapshot 时创建的举例mysql> CRE原创 2022-03-14 10:10:49 · 1404 阅读 · 0 评论 -
第四章 数据库索引
第四章 数据库索引索引是排好序的快速查询的数据结构什么是索引 ?最好的例子就是我们从小就用的字典里面的声母查询方式就是聚簇索引。偏旁部首就是二级索引偏旁部首+笔画就是联合索引。这种方式比较适合人类的思维方式,设计也比较精妙。索引的常见模型三种常见的数据结构:哈希表、有序数组、搜索树哈希表哈希表这种结构适用于只有等值查询的场景什么是等值查询 ?等值查询就是例如:select name from T where id = 12等值查询就是用等号来匹配查询结果,分为单原创 2022-03-12 12:08:18 · 2230 阅读 · 4 评论 -
第三章 事务隔离
第三章 事务隔离事务的特性:原子性、一致性、隔离性、持久性在 MySQL 中,事务支持是在引擎层实现的。MyISAM 既不支持事务,又没有 crash-safe。隔离性与隔离级别当数据库上有多个事务同时执行的时候,就有可能出现以下几种情况:脏读:读到其他事务未提交的数据;不可重复读:前后读取的记录内容不一致;幻读:前后读取的记录数量不一致。为了解决这些情况,就有了“隔离级别”的概念SQL 标准的事务隔离级别包括:读未提交(read uncommitted):别人改数据原创 2022-03-11 19:10:07 · 684 阅读 · 0 评论 -
第二章 从更新角度看MySQL 执行流程
第二章 从更新角度看MySQL 执行流程从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键 ID 和一个整型字段 c:mysql> create table T(ID int primary key, c int);如果要将 ID=2 这一行的值加 1,SQL 语句就会这么写:mysql> update T set c=c+1 where ID=2;执行流程连接器进行连接数据库的工作分析器会通过词法和语法解析知道这是一条更新语句优化器决定使用I原创 2022-03-10 21:04:24 · 756 阅读 · 0 评论 -
第一章 从零看MySQL基础架构
第一章 从零看MySQL基础架构MySQL 逻辑架构图MySQL 可以分为 Server 层 和 存储引擎层 两部分Server 层包括 连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory(内存引擎) 等多个存储引擎。现在最常用的存储原创 2022-03-09 23:40:59 · 538 阅读 · 0 评论