![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL
文章平均质量分 83
数据库内核
这个作者很懒,什么都没留下…
展开
-
MySQL存储管理(一):删数据
表空间可以看做是InnoDB存储引擎逻辑结构的最高层,所有的数据都存放在表空间中。默认情况下,InnoDB存储引擎有一个共享表空间idbdata1,即所有数据都存放在这个表空间内。如果用户启用了参数 innodb_file_per_table,则每张表内的数据可以单独放到一个表空间内。原创 2024-06-21 18:44:34 · 1055 阅读 · 0 评论 -
MySQL日志(三):数据安全
回答这个问题前,先看一下磁盘、SSD、内存随机读写与顺序读写的性能对比,如下图所示:从上图可以看出两点:1)内存的读写速度比磁盘随机读写高出几个数量级。2)磁盘顺序读写速度堪比内存读写速度。问1:什么是WAL呢?WAL即 Write Ahead Log,WAL的核心思想是,每次更新操作都先写入日志,只做了写日志这一个磁盘操作。这个日志叫做redo log(重做日志),也就是《孔乙己》记账的粉板,在更新完内存写完redo log后,就返回给客户端,本次更新成功。原创 2024-06-14 19:37:26 · 878 阅读 · 0 评论 -
MySQL日志(二):MySQL抖动
一条SQL语句, 正常执行的时候特别快, 但是有时也不知道怎么回事, 它就会变得特别慢, 并且这样的场景很难复现, 它不只随机, 而且持续时间还很短。看上去, 这就像是数据库“抖”了一下。今天, 我们就一起来看一看这是什么原因。原创 2024-06-14 19:30:55 · 887 阅读 · 0 评论 -
MySQL主从复制(六):数据库是否可用
所以, 我们说InnoDB在设计时, 遇到进程进入锁等待的情况时, 将并发线程的计数减1的设计, 是合理而且是必要的。因此上述select 1示例中,同时在执行的语句超过了设置的innodb_thread_concurrency的值, 这时候系统其实已经不行了, 但是通过select 1来检测系统, 会认为系统还是正常的。注:虽然说等锁的线程不算在并发线程计数里, 但如果它在真正地执行查询, 就比如我们上面例子中前三个事务中的select sleep(100) from t, 还是要算进并发线程的计数的。原创 2024-06-13 13:57:25 · 1120 阅读 · 0 评论 -
MySQL主从复制(五):读写分离
一主多从架构主要应用场景:读写分离。读写分离的主要目标是分摊主库的压力。原创 2024-05-24 20:24:28 · 1323 阅读 · 0 评论 -
MySQL主从复制(四):主备切换
一主多从结果:图中, 虚线箭头表示的是主备关系, 也就是A和A’互为主备, 从库B、 C、 D指向的是主库A。一主多从的设置, 一般用于读写分离, 主库负责所有的写入和一部分读, 其他的读请求则由从库分担。主备切换后结果:相比于一主一备的切换流程, 一主多从结构在切换完成后, A’会成为新的主库, 从库B、 C、 D也要改接到A’。正是由于多了从库B、 C、 D重新指向的这个过程, 所以主备切换的复杂性也相应增加了。原创 2024-05-24 20:17:19 · 1325 阅读 · 0 评论 -
MySQL主从复制(三):主从延迟
主备流程图:谈到主备的复制能力,要关注的是上图中的两个黑色箭头。一个箭头代表了客户端写入主库,另一个箭头代表的是sql_thread执行中转日志(relay log)。如果用箭头的粗细来代表并行度的话,那么真实情况就如图所示,第一个箭头要明显粗于第二个箭头。1)在主库上,影响并发度的原因就是各种锁了。由于InnoDB引擎支持行锁, 除了所有并发事务都在更新同一行(热点行) 这种极端场景外, 它对业务并发度的支持还是很友好的。原创 2024-05-24 20:06:51 · 1070 阅读 · 0 评论 -
MySQL主从复制(二):高可用
正常情况下, 只要主库执行更新生成的所有binlog, 都可以传到备库并被正确地执行, 备库就能达到跟主库一致的状态, 这就是最终一致性。但是, MySQL要提供高可用能力, 只有最终一致性是不够的。原创 2024-05-24 20:01:37 · 763 阅读 · 0 评论 -
MySQL主从复制(一):主备一致
这条命令不是我们主动执行的, 而是MySQL根据当前要操作的表所在的数据库,自行添加的。2)另一种场景是, 有三个节点的时候, 如图所示, trx1是在节点 B执行的, 因此binlog上的server_id就是B, binlog传给节点 A, 然后A和A’搭建了双M结构, 就会出现循环复制。你可以看到, 当binlog_format使用row格式的时候, binlog里面记录了真实删除行的主键id, 这样binlog传到备库去的时候, 就肯定会删除id=4的行, 不会有主备删除不同行的问题。原创 2024-05-24 19:57:02 · 790 阅读 · 0 评论 -
MySQL基础知识:MySQL索引
索引的意义:在大量数据中,加速访问少量特定数据;使用索引的前提条件:1)索引块数量小于数据块数量;2)索引键有序,故可以使用二分查找等高效的查找方式;(提升查找效率)3)索引文件足够小,能够长期存放在内存缓冲区中;(减少磁盘IO)注:当查询数据量超过一定比例时,全表扫描可能比走索引更高效。原创 2024-04-26 20:12:16 · 1000 阅读 · 0 评论 -
MySQL基础知识:MySQL事务
在视图A、B、C里面,这一个记录的值分别是1、2、4,同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC);当数据库上有多个事务同时执行的时候, 就可能出现脏读(dirtyread) 、 不可重复读(non-repeatable read) 、 幻读( phantom read) 的问题, 为了解决这些问题, 就有了“隔离级别”的概念。1)每行数据有多个版本,按照事务ID倒序排列,每次事务更新数据时,会生成一个新的数据版本,并在版本中记录事务ID,即row trx_id;原创 2024-04-13 19:34:24 · 1454 阅读 · 1 评论 -
MySQL日志(一):更新语句执行流程
一条查询语句的执行过程一般是经过连接器、 分析器、 优化器、 执行器等功能模块, 最后到达存储引擎。那么, 一条更新语句的执行流程又是怎样的呢?下面我们从一个表的一条更新语句进行具体介绍:首先, 可以确定的说, 查询语句的那一套流程, 更新语句也是同样会走一遍。更新语句的执行流程:1)连接器连接数据库;2)分析器通过词法分析和语法分析直到这是一条更新语句;3)优化器决定1使用ID这个索引;4)执行器负责具体执行,找到这一行,然后更新。原创 2024-04-13 17:05:41 · 1098 阅读 · 0 评论 -
MySQL基础知识:MySQL架构
看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样, 对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。我们看到的只是输入一条语句, 返回一个结果, 却不知道这条语句在MySQL内部的执行过程。原创 2024-04-13 16:54:42 · 748 阅读 · 0 评论 -
Ubuntu快捷安装MySQL
注:设置完密码后,后续如果使用 mysql -uroot -h127.0.0.1 -pkingsoft. -P3306(可使用 mysql -uroot -h localhost -pkingsoft. -P3306 命令代替)命令连接mysql时,可能会报错。注:如果 /etc/my.cnf 文件存在,则优先使用该文件,如果 /etc/my.cnf 文件不存在,则使用 /etc/mysql/my.cnf 文件,以此类推。注1:如果不加127.0.0.1,则本地proxy无法连接到mysql。原创 2024-04-11 18:47:29 · 626 阅读 · 0 评论 -
MySQL 主从复制部署(8.0)
主从数据库是一种数据库架构模式,通常用于提高数据库的性能、可用性和可伸缩性。它包括两种类型的数据库服务器:1)主数据库(Master):主数据库是读写数据的主要数据库服务器。所有写操作(插入、更新、删除)都在主数据库上执行。主数据库负责维护数据的一致性,并将写操作的变更记录下来。2)从数据库(Slave):从数据库是只读副本,它从主数据库中复制数据。承担一部分主库的的读数据压力,从而减轻了主数据库的负担。从数据库可以有多个,构成一个复制链,其中每个从数据库都从前一个从数据库中复制数据。原创 2024-04-10 18:46:06 · 1278 阅读 · 0 评论 -
物理查询优化(二):两表连接算法(附具体案例及代码分析)
Hash Join 是一种执行连接的方法,如下图所示:选择合适的连接参与表作为内表(build table),构建hash表;然后使用另外一个表(probe table)的每一条记录去探测第一步已经构建完成的哈希表寻找符合连接条件的记录;输出匹配后符合需求的记录;排序归并连接算法又称归并排序连接算法,简称归并连接算法。归并连接算法需要首先对两个表按照关联的字段进行排序,然后分别从两个表中取出一行数据进行匹配,如果合适放入结果集;原创 2024-03-23 17:34:11 · 1515 阅读 · 0 评论 -
Etcd 介绍与使用(入门篇)
etc (基于 Go 语言实现,)在 Linux 系统中是配置文件目录名;etcd 就是配置服务;etcd 诞生于 CoreOS 公司,最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分发等问题。基于此,etcd 设计为提供高可用、强一致性的小型** kv 数据存储**服务。项目当前隶属于 CNCF 基金会,被包括 AWS、Google、Microsoft、Alibaba 等大型互联网公司广泛使用;原创 2024-03-17 16:45:53 · 2702 阅读 · 0 评论 -
物理查询优化(一):索引的使用(案例分析)
从上述 查询执行计划来看,尽管连接条件 a1 = b1 中的 a1 列和 b1 列都是索引列,但在表 a 中使用了顺序扫描,在表 b 中使用了索引扫描。从查询执行计划来看,a1 和 b1 都走了索引,能走索引的原因是在连接条件中,出现了 a1 = 1 条件,使得查询优化器可以根据 ”常量传递“ 优化技术推知 b1 = 1,所以在表 a 和 b 上可以各自使用索引扫描。9)对表做查询,有索引列对象作为过滤条件,操作符是范围操作符 ,可做索引扫描(PG 不可做索引扫描),且可走 ICP下推;原创 2024-02-27 21:24:27 · 602 阅读 · 0 评论 -
GDB 调试 MySQL 源码
说明:执行完启动命令后会直接跳转到 “--Type for more, q to quit, c to continue without paging--” 直接回车即可!回车后,如果出现:Reading symbols from /usr/local/mysql80/bin/mysqld...,则说明启动成功!直接回车,便可进入语句:select * from t1 where id >8 limit 2, 2;由上图可知,调试进入了 is_cond_match_ranges 函数的第一行!原创 2024-02-21 09:57:48 · 714 阅读 · 0 评论 -
Sysbench 性能测试(小白快速上手)
Sysbench 是一个在Linux系统上进行性能测试和基准测试的工具。它可以用于评估计算机系统的各种性能指标,如 CPU 性能、内存性能、文件 I/O性 能和数据库性能等。Sysbench 提供了多种测试模式和选项,可以帮助用户模拟不同负载条件下的性能表现,从而有助于优化系统配置和应用程序性能。1)Sysbench 附带了以下捆绑的基准测试oltp_*.lua:类似oltp的数据库基准的集合fileio:文件系统级基准测试cpu:简单的cpu基准测试memory:内存访问基准。原创 2024-02-06 20:10:23 · 2641 阅读 · 0 评论 -
InnoDB 锁系统(小白入门)
锁是数据库系统区别于文件系统的一个关键特性。数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性。虽然数据库系统做的越来越类似,但有多少种数据库,就可能有多少种锁的实现方法。对于 MyISAM 引擎,其锁是表锁设计。并发情况下的读没有问题,但是并发插入时的性能就要差一些,若插入是在“底部”,MyISAM 存储引擎还是有一定的并发写入操作。对于 Microsoft SQL Server 数据库,在 2005 版本之前其都是页锁。相对表锁的 MyISAM 引擎来说,并发性能有所提高。原创 2024-02-04 21:47:22 · 672 阅读 · 0 评论 -
tcpdump、wireshark 抓包分析(小白快速上手)
网络世界中的数据包一般都是不可见的,导致在学习计算机网络的时候会觉得其非常抽象,加大了学习的难度。自从有了网络包分析工具:tcpdump 和 Wireshark,使不可见的数据包得以可视化。问题:tcpdump 和 wireshark 有什么区别?tcpdump 和 wireshark 是最常用的网络抓包和分析工具,更是分析网络性能必不可少的利器。1)tcpdump 仅支持命令行格式使用,常在 Linux 服务器中抓取和分析网络包;原创 2024-01-23 22:06:33 · 2038 阅读 · 1 评论 -
MySQL 协议(非常详细适合小白学习)
MySQL 查询过程大致如下:1)客户端与服务器端建立连接;2)客户端登陆 MySQL;3)客户端向服务器端发起一条请求;4)服务器端先检查查询缓存,如果命中缓存,则直接返回结果;否则交给下一阶段;5)服务器进行 SQL 解析并生成解析树及执行计划(初始执行计划);6)服务器对解析树进行查询优化(RBO、CBO)并生成最终执行计划;7)MySQL 根据执行计划,调用相应 API,以进行数据的读取;8)将从存储引擎读取的结果返回给客户端,并缓存查询结果。原创 2024-01-15 22:54:09 · 2401 阅读 · 0 评论 -
JDBC PrepareStatement 的使用(附各种场景 demo)
1)PreparedStatement 继承自 Statement ,是 Statement 的一种扩展;2)PreparedStatement 特点:使用 PreparedStatement 可以执行动态参数化 sql(在 sql 语句中用占位符?原创 2024-01-12 18:56:55 · 3102 阅读 · 0 评论 -
MVCC 并发控制原理-源码解析(非常详细)
1)脏读:一个事务读取到另一个事务更新但还未提交的数据,如果另一个事务出现回滚或者进一步更新,则会出现问题。2)不可重复读:在一个事务中两次次读取同一个数据时,由于在两次读取之间,另一个事务修改了该数据,所以出现两次读取的结果不一致。3)幻读:在一个事务中使用相同的 SQL 两次读取,第二次读取到了其他事务新插入的行。要解决这些并发事务带来的问题,一个比较简单粗暴的方法是加锁,但是加锁必然会带来性能的降低,因此 MySQL 使用了 MVCC 来提升并发事务下的性能。原创 2024-01-02 22:04:50 · 1192 阅读 · 0 评论 -
MySQL 快捷登陆
通过将 MySQL 登录命令添加到环境变量并创建别名,您可以更方便地使用自定义的命令来登录 MySQL 数据库。注意:请确保将 `/usr/local/mysql57` 替换为您的 mysql 安装路径。现在,您可以使用 `mysql57` 命令来登录 MySQL。原创 2023-12-08 18:34:55 · 632 阅读 · 0 评论 -
MySQL Server 层和引擎层是如何交互的
之所以定义 2 个 bit 字段,是为了测试 bit 类型的字段,定义的 bit 位数不是 8 的整数倍时,是不是会把多出来的那些 bit 存储到 字段值 NULL 标记区域中,后来发现,只有 MyISAM、NDB 存储引擎才会这样处理,InnoDB 中 bit 字段是按 char 存储的,bit 位数不是 8 的整数倍时,多出来的 bit 还需要占用 1 字节,比如:bit(17) 需要占用 3 字节。如果 c1 字段的实际内容长度比字段内容最大字节数小,会挨着刚刚写入的内容,再写入一定数量的空格。原创 2023-12-06 22:53:21 · 1058 阅读 · 0 评论 -
MySQL 性能优化
如果没有索引,数据库就只能扫描整个员工表,然后依次判断每个数据记录中的员工编号是否等于5并且返回满足条件的数据。这种查找数据的方法被称为**全表扫描**(Full Table Scan)。全表扫描最大的一个问题,就是当表中的数据量逐渐增加时性能随之明显下降,因为磁盘 I/O 是数据库最大的性能瓶颈。当表中的数据量很小(例如配置表),或者查询需要访问表中大量数据(数据仓库),索引对查询的优化效果不会很明显。为了解决大量磁盘访问带来的性能问题,MySQL引入了一个新的数据结构:索引(Index)。原创 2023-12-02 16:34:15 · 991 阅读 · 0 评论 -
MySQL 事务
事务就是要保证一组数据库操作, 要么全部成功, 要么全部失败。在MySQL中,事务支持是在引擎层实现的。你现在知道, MySQL是一个支持多引擎的系统, 但并不是所有的引擎都支持事务。比如MySQL原生的MyISAM引擎就不支持事务, 这也是MyISAM被InnoDB取代的重要原因之一。原创 2023-11-30 20:19:37 · 1063 阅读 · 0 评论 -
MySQL 生僻概念汇总
在数据库中,索引是一种用于提高查询效率的数据结构。当执行查询操作时,数据库可以使用索引来快速定位和访问所需的数据。"将索引游标定位到句柄中指定的索引"这句话的意思是,数据库会使用一个称为游标的指针或标记,将其定位到指定的索引位置。这个过程通常发生在执行索引读取操作时,即根据索引的值来检索数据。语句中的"游标定位"指的是将游标移动到指定位置的操作。在数据库中,游标可以被视为一个指向查询结果集中的当前行的指针。通过移动游标,您可以在结果集中定位到不同的行,并执行相应的操作,比如读取行的数据。原创 2023-11-29 19:55:24 · 1143 阅读 · 0 评论 -
MySQL 索引类型
索引是一种用于提高数据库查询性能的数据结构。它是在表中一个或多个列上创建的,可以加快对这些列的数据检索速度。索引的作用是通过创建一个额外的数据结构,使得数据库可以更快地定位和访问数据。当执行查询语句时,数据库可以使用索引来快速定位满足查询条件的数据行,而不需要逐行扫描整个表。这样可以大大减少查询的时间和资源消耗。需要注意的是,虽然索引可以提高查询性能,但过多或不合理的索引也会带来一些负面影响。索引需要占用额外的存储空间,并在插入、更新和删除操作时增加了维护成本。原创 2023-11-28 21:29:05 · 1192 阅读 · 1 评论 -
Clion+Ubuntu(WSL)+MySQL8.0开发、调试环境搭建
该命令的目的是创建一个名为mysql的系统用户,并将其添加到mysql用户组中。说明:初始化文件 my.cnf 可以放在不同的文件夹下(一台机器上装多个 mysql 时,可以在不同的文件夹下创建 my.cnf),但初始化命令中使用到的 my.cnf 路径要与其保持一致;初始化完成后,找到 mysql 安装目录下的 data 文件夹,初始化密码在 mysqld.log 日志中,自行找到即可,然后用初始密码进行登陆;)并下载 MySQL 8.0 的源码包(mysql-boost-8.0.31.tar.gz)。原创 2023-11-27 21:25:21 · 1779 阅读 · 3 评论 -
VsCode 调试 MySQL 源码
3. 使用 VsCode 打开 MySQL 源码。7. 输入上述查询的 MySQL 进程号,回车。10. 在终端执行 SQL 命令,即可调试。9. 在 VsCode 中手动设置断点。6. 点击 Debug mysqld。8. 进入 MySQL 调试环境。2. 查看 MySQL 进程号。1. 启动 MySQL。5. 点击调试运行按钮。原创 2023-11-27 21:17:09 · 1369 阅读 · 0 评论 -
MySQL 优化器 ICP 下推(让你彻底理解 ICP)
ICP(Index Condition Pushdown,索引下推),是 MySQL 5.6 版本推出的功能,用于优化 MySQL 查询。ICP 可以减少存储引擎查询回表的次数以及 MySQL server 层访问存储引擎的次数。ICP 的目标是减少整行记录读取的次数,从而减少 I/O 操作。原创 2023-11-24 22:28:01 · 1338 阅读 · 0 评论 -
MySQL 优化器 MRR
MRR 的全称是 Multi-Range Read Optimization,是优化器将随机 IO 转化为顺序 IO 以降低查询过程中 IO 开销的一种手段,咱们对比一下 mrr=on & mrr=off 时的执行计划:可以看到 extra 的输出中多了 “Using MRR” 信息,即使用了 MRR Optimization IO 层面进行了优化,减少 IO 方面的开销,更详细的说明可以参考。原创 2023-11-24 22:08:20 · 1482 阅读 · 0 评论 -
Ubuntu(WSL2) 源码安装 mysql8.0/mysql5.7
初始化文件 my.cnf 可以放在不同的文件夹下(一台机器上装多个 mysql 时,可以在不同的文件夹下创建 my.cnf),但初始化命令中使用到的 my.cnf 路径要与其保持一致;初始化完成后,找到 mysql 安装目录下的 data 文件夹,初始化密码在 mysqld.log 日志中,自行找到即可,然后用初始密码进行登陆;my.cnf文件中的 /usr/local/mysql 为mysql安装路径,根据自己情况进行更改,该mysql安装目录为:/usr/local/mysql;原创 2023-11-11 00:31:50 · 1614 阅读 · 0 评论 -
mysql8.0.31 源码阅读
虚析构函数(Virtual Destructor)是C++中的一个特殊函数,用于在继承关系中正确释放资源。当基类指针指向派生类对象时,如果基类的析构函数不是虚析构函数,那么在使用 `delete` 删除基类指针时,只会调用基类的析构函数,而不会调用派生类的析构函数,这可能导致派生类中的资源无法正确释放,造成内存泄漏。为了解决这个问题,可以将基类的析构函数声明为虚析构函数。虚析构函数使用 `virtual` 关键字进行声明,它允许在通过基类指针删除对象时,调用正确的析构函数。原创 2023-10-05 16:10:23 · 479 阅读 · 0 评论 -
MySQL 启动失败:Can‘t connect to local MySQL server through socket ‘/usr/local/mysql/data/mysql.sock‘
CentOS7 使用源码安装完 MySQL8.0.31 后,出现启动失败问题!!!原创 2023-07-31 17:02:22 · 2383 阅读 · 0 评论 -
MySQL学习笔记 ------ 常见约束
CONSTRAINT ck CHECK(gender ='男' OR gender = '女'),#检查------事实上在mysql中不支持。gender CHAR(1) CHECK(gender='男' OR gender ='女'),#检查------事实上在mysql中不支持。【constraint 约束名】 约束类型(字段名) ---【constraint 约束名】意思是可省略,不起名时会有默认名,即默认字段名。id INT PRIMARY KEY,#主键---约束为学号。原创 2023-07-26 08:47:28 · 183 阅读 · 0 评论 -
MySQL学习笔记 ------ 数据类型
char char(M) 最大的字符数,可以省略,默认为1 固定长度的字符 比较耗费 高。varchar varchar(M) 最大的字符数,不可以省略 可变长度的字符 比较节省 低。① 如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字。③定点型的精确度较高,如果要求插入数值的精度较高如货币运算等则考虑使用。所选择的类型越简单越好,能保存数值的类型越小越好。原创 2023-07-26 08:46:35 · 167 阅读 · 0 评论