mysql
文章平均质量分 64
士多碧莉
不要做程序猿,要做工程狮,吼吼
展开
-
MySQL崩溃后的恢复
这种情况下,意味着事务失败,我们希望系统可以恢复到事务开始前的状态。但是有可能部分redo log已经落盘了,此时如果通过redo log恢复系统,则会造成出现脏数据的现象。系统会从undo log中找到当前为active的事务ID,即未提交的事务id,把这些事务对应的改动全部回滚掉,从而保证了事务的原子性。我们知道,一般情况下,事务提交时,redo log buffer会强制刷盘。所以系统崩溃后,系统可以通过redo log恢复系统到崩溃前的状态,从而保证了事务持久性。原创 2022-11-04 16:46:46 · 1027 阅读 · 0 评论 -
MySQL:巧妙利用1=1和1!=1
就是拼接查询语句时,后面没有查询条件报错,我已经踩过这个坑了,于是乎我在代码中处理了这件事,当有查询条件时拼接WHERE,否则不拼接WHERE。这太傻瓜了/(ㄒoㄒ)/~~。实际上可以用1=1来充当占位符,1=1永远是TRUE,就是一个占位符的角色,可以避免WHERE后面条件为空的尴尬,减少判断逻辑。有时我们仅仅只需要表结构,而不需要表数据,那么可以用11,因为11永远为False,查询出来的数据表为空,只有表头。在开发过程中,经常会碰到这种错误。原创 2022-09-29 15:02:12 · 887 阅读 · 0 评论 -
MySQL事务:事务id分配策略
从MySQL的事务ID处理可以学习到,当需要提高性能时,可以把数据存储在内存中,并且按照一定的规则刷新到磁盘中持久化,而不是每次都刷盘,因为每次刷盘代表一次IO,当然这需要看具体需求,重要数据就不能这么做。为什么要+256呢?因为可能会系统异常退出,此时内存中的值还没有刷盘,所以要加上256,防止事务ID冲突,缺点时会存在跳号的情况,但是这是我们可以容忍的,因为最大也就浪费256个号。系统会在内存中维护一个全局变量存储当前最大事务ID值,每当开始一个新事务时,就会把这个值赋给该事务,然后这个变量自增1。原创 2022-09-22 19:32:36 · 834 阅读 · 0 评论 -
聊聊 mysql 事务?(一)
事务 transaction 是一个抽象的概念,其实就是一组操作集合。mysql 不是所有存储引擎都支持事务,只有 InnoDB 和 NDB 支持(下文忽略)。自动提交自动提交的默认值为ON,就是说默认情况下,如果不显示声明开启事务,那么每次执行SQL语句都算一次事务,MYSQL帮我们自动提交了。-- 第一种:-- 第二种:WORK 可省略两种语句的效果一致,只不过START TRANSACTION可以加限定条件,有兴趣的自行查下资料。原创 2022-09-17 15:39:10 · 591 阅读 · 0 评论 -
聊聊 mysql 事务?(二:redo log保证事务持久性)
需要注意的是,不是每次flush脏页,都会进行一次checkpoint,这两个任务一般情况下是不同线程执行的,checkpoint是指,从flush链表中计算最大可以被覆盖的redo日志对应的lsn值,然后更新到redo日志中的管理信息中去。可能有的人会想,那直接刷盘不就行了,但是想想看,MySQL为啥要先写入BufferPool而不是直接刷盘,不就是为了提高性能嘛,一次事务可能涉及到多张表,多个索引,这些需要操作的页都不一定是连续的,会产生很多的随机IO,这是我们无法接受的。原创 2022-09-19 20:13:16 · 1267 阅读 · 0 评论 -
聊聊 mysql 事务?(三:从redo log恢复数据)
MySQL的事务有四大特性,其中之一是持久性,这要求系统奔溃后数据可以被正常恢复。为了保证持久性,引入了redo日志。从性能方面考虑,redo日志先写到buffer区,在适当时机再刷盘到file。从存储方面考虑,为了防止log日志越来越大,MySQL采用了循环写入。为了保证循环写入时,不丢失未持久化的数据,又引入了checkponit的概念,通过checkpoint_lsn可以知道那些日志可以被覆盖。原创 2022-09-20 11:30:37 · 1329 阅读 · 0 评论 -
MYSQL 为什么不要使用SELECT * 作为查询条件?(持续更新)
请注意,这篇文章仅针对 InnoDB 存储引擎讨论。1、减少回表次数我们知道,InnoDB 中索引分为两种,聚簇索引和二级索引,其中聚簇索引的叶子节点存放完整的用户数据,而二级索引的叶子节点只存放 索引列+主键 数据,并且叶子节点按照索引列值从小到大排序链接,具体的,大家可以自行查阅资料补充知识点。当我们执行像这么一条查询语句时SELECT *FROM t1WHERE key1 = "a"假设 t1 中有2个索...原创 2022-04-20 17:21:50 · 4282 阅读 · 0 评论 -
MySQL InnoDB数据页结构,数据在单页内是如何存储的,如何快速定位数据位置
InnoDB为不同的目的设计了很多不同类型的页:存放空间头部信息的页 存放ChangeBuffer的页 存放INODE信息的页 存档UNDO日志信息的页 存档记录的页(索引页) 等等目录1 页结构1.1 User Records1.1.1 User Records 中的记录头信息1.2 Page Directory那么,划分组的依据是什么呢?那么,想要查找一条记录时,是怎样提高效率的呢?那么,如何找到槽2所在分组中主键最小的那条记录呢?1.3 页面头部1.原创 2022-04-15 18:25:47 · 1688 阅读 · 0 评论 -
MYSQL 启动选项和系统变量
目录1 启动选项1.1 在命令行上使用选项1.1.1 长形式1.1.2 短形式1.2 在配置文件上使用选项1.2.1 配置文件路径1.2.2 配置文件的内容2 系统变量2.1 查看系统变量2.2 设置系统变量2.2.1 通过启动选项配置2.2.3 系统变量的作用范围3 启动选项和系统变量的区别4 状态变量1 启动选项1.1 在命令行上使用选项选项名区分大小写 只作用当次启用1.1.1 长形式选项名前使用-- 选项名原创 2022-04-12 17:11:47 · 1155 阅读 · 0 评论 -
MYSQL 文件目录,数据库的存储文件目录
客户端以及其他可执行文件目录:/usr/bin/mysql 客户端 TIPS: 最好不要在一行命令中输入密码,因为history、ps等命令可以看到 各个参数顺序没有规定mysql_config_editormysql_migrate_keyringmysql_secure_installationmysql_ssl_rsa_setupmysql_tzinfo_to_sqlmysql_upgrademysqladminmysqlbin原创 2022-04-12 16:55:54 · 1677 阅读 · 0 评论 -
mysql忘记密码后重置密码
请注意,以下操作一定不要在生产环境玩一、关闭mysql服务端找到mysqld进程,kill掉即可二、实现免密登陆mysqld找到 mysql安装目录/bin 下执行mysqld --console --skip-grant-tables有时会报错[ERROR] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root这是因为mys...原创 2021-11-02 16:07:48 · 103 阅读 · 0 评论 -
MYSQL 中的 COLLATE 到底是什么?
一直使用建表语句create database <db_name>default charset utf8 collate utf8_general_ci;殊不知,这个语句建表竟然有个大坑。mysql中有utf8和utf8mb4。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,比如emo...原创 2019-11-19 14:08:09 · 3443 阅读 · 1 评论