MySQL
文章平均质量分 84
又 欠
欲速则不达 欲达则欲速
展开
-
MySQL是如何保证高可用的
主备延迟指的是主库执行完成的时间和备库执行完成的时间的差距主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;备库 B 执行完成这个事务,我们把这个时刻记为 T3。所以主备延迟,就是同一个事务,在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1。原创 2022-11-12 21:27:59 · 3463 阅读 · 3 评论 -
MySQL是如何保证主从一致的
Binary log(二进制日志),简称Binlog。Binlog是记录所以数据表结构变更以及表数据修改的二进制日志,不会记录select和show这类操作。Binlog是以事件形式记录,还包括语句所执行的消耗时间。Binlog是MySql Server自己的日志,但是Redo Log是基于InnoDB引擎所特有的日志。它是一个逻辑日志。主从复制在主库开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。数据恢复。原创 2022-11-02 10:02:15 · 12587 阅读 · 4 评论 -
MySQL是如何保证数据不丢失的
1.SQL语句(update user set name=‘李四’ where id=3)的执行流程是怎样的呢?1.执行器先找引擎取 ID=3这一行。ID 是主键,引擎直接用树搜索找到这一行。2.如果 ID=3 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。3.执行器拿到引擎给的行数据,把name这个值改成李四 得到新的一行数据,再调用引擎接口写入这行新数据。原创 2022-10-27 09:22:22 · 11221 阅读 · 7 评论 -
一篇文章搞懂MySQL的order by
因为上面全字段排序sort_buffer确定的是first_name, last_name,score,copy_id四个字段,而这里rowid排序确定的是copy_id 和 id,大大的减少sort_buffer的大小。3.到主键 id 索引取出整行,first_name, last_name,score,copy_id 这四个字段,存入sort_buffer 中;1.初始化 sort_buffer,确定放入 first_name, last_name,score,copy_id 这四个字段;原创 2022-10-17 22:57:13 · 7351 阅读 · 19 评论 -
一篇文章了解Like用法及常见索引失效情况
本文主要通过介绍Like索引优化以及全文索引,以MySQL为例。reverse()应用场景,比如你根据身份证查询一个市洲的人员信息。众所周知,同一个市洲大部分人员身份证前6位是相同的,比如黄石,前六位420222。这个时候你就可以通过reverse()字段,创建身份证后6位的前缀索引进行查询。**原创 2022-09-20 23:11:10 · 11384 阅读 · 0 评论 -
MySQL执行顺序及优化
在上述例子中,如果我们join_buffer更小,被驱动表就会被多次扫描,而且这个语句执行时间超过 1 秒,就会在再次扫描t2表的时候,把t2表的数据页移到 LRU 链表头部。在多个条件下,无法判断哪一个会先执行,往往会先执行1=1,在大数据执行情况下会消耗MySQL的性能,在使用mybatis时,可以用where标签代替。max_length_for_sort_data表示MySQL用于排序行数据的长度的一个参数,如果单行的长度超过这个值,MySQL 就认为单行太大,就换rowid 排序。原创 2023-01-07 17:30:13 · 2795 阅读 · 0 评论 -
MySQL自增主键一定是连续的吗
自增锁是一种比拟非凡的表级锁。并且在事务向蕴含了 AUTO_INCREMENT 列的表中新增数据时就会去持有自增锁,假如事务 A 正在做这个操作,如果另一个事务 B 尝试执行 INSERT语句,事务 B 会被阻塞住,直到事务 A 开释自增锁。原创 2022-12-21 14:50:57 · 1061 阅读 · 1 评论 -
mybatis以及mybatisplus批量插入问题
方案一 就是用 for 循环循环插入:优点:JDBC 中的 PreparedStatement 有预编译功能,预编译之后会缓存起来,后面的 SQL 执行会比较快并且JDBC 可以开启批处理,这个批处理执行非常给力。缺点:很多时候我们的 SQL 服务器和应用服务器可能并不是同一台,所以必须要考虑网络 IO,如果网络 IO 比较费时间的话,那么可能会拖慢SQL 执行的速度。原创 2022-12-12 18:00:17 · 10458 阅读 · 1 评论 -
一篇文章了解MySQL的group by
1.本文章MySQL使用的是5.7,引擎使用的是innodb2. 使用的表结构(t1),字段a上有一个索引,group by的常规用法是配合聚合函数,利用分组信息进行统计,常见的是配合max等聚合函数筛选数据后分析,以及配合having进行筛选后过滤。聚合函数:示例1: 查询t1表,按照字段b进行分组,并求出分组后b字段a的总和。实例2:查询t1表,按照字段b进行分组,拿到b原创 2022-12-04 19:32:00 · 10550 阅读 · 1 评论 -
MySQL的join你真的了解吗!!!
1. 应该使用小表作为驱动表2. 被驱动表关键字段应该建立索引3.被驱动表无法使用索引、数据量很大时,因适当调整join_buffer大小。避免 Buffer Pool 的热数据被淘汰,影响内存命中率。4.MySQL8.0之后版本,已经支持hash join,没有升级的小伙伴赶紧升级把!!!阿根廷加油,梅老板牛逼!!!原创 2022-11-27 18:31:33 · 2723 阅读 · 3 评论 -
MySQL的缓冲池(buffer pool)及 LRU算法
buffer pool 是数据库的一个内存组件,里面缓存了磁盘上的真实数据,Java系统对数据库的增删改操作,主要是这个内存数据结构中的缓存数据执行的。控制块存的是 数据页所属的表 空间号,数据页编号,数据页地址等信息是放在缓存页的前面控制块占缓冲页百分之5左右的内存大小缓存页1.buffer pool中存放的数据页我们叫缓存页,和磁盘上的数据页是一一对应的,都是16KB2.缓存页的数据,是从磁盘上加载到buffer pool当中的。原创 2022-11-19 20:49:24 · 1734 阅读 · 0 评论 -
MySQL思维导图
MySQL思维导图原创 2022-10-24 09:41:53 · 2118 阅读 · 0 评论 -
MySQL(Select count(*))为什么这么慢!!!
3.如果能将数据统一在同个载体即MySQL,并由其保证操作的原子性,即将插入一行数据和计数加1作为一个完整的事务,通过事务的隔离此时外界看到的就是要么全部执行完毕要么全部都没执行,进而保持逻辑一致。此外需要注意的是,我们在这篇文章里讨论的是没有过滤条件的 count(其实MySQL是做了优化的,因为InnoDB 是索引组织表,主键索引树的叶子节点是数据,而普通索引树的叶子节点是主键值。因为即使是在同一个时刻的多个查询,由于多版本并发控制(MVCC)的原因,InnoDB 表“应该返回多少行”也是不确定的。原创 2022-10-08 22:12:39 · 11919 阅读 · 6 评论 -
MySQL数据切割换行,数据拆分
比如“www.mysql.com”截取字符‘www’,分割符为“.”,从左到右序号为1,即substring_index(“www.mysql.com”,‘.’,1);若从右开始获取“com”则为序号为-1即substring_index(“www.mysql.com”,‘.’,-1)语法: REPLACE ( string_expression , string_pattern , string_replacement)sep:分隔符,string存在且用于分割的字符,比如“,”、“.”等。原创 2022-09-27 17:09:30 · 2452 阅读 · 2 评论 -
MySQL原理
> Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL> 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。原创 2022-07-26 18:28:17 · 3191 阅读 · 0 评论 -
MySQL事务
即,事务不可分割、不可约简。1.长事务意味着系统里面会存在很老的事务视图,在这个事务提交之前,回滚记录都要保留,这会导致大量占用存储空间。读未提交(read uncommitted)别人改数据的事务尚未提交,我在我的事务中也能读到。可重复读(repeatable read)别人改数据的事务已经提交,我在我的事务中也不去读。读已提交(read committed)别人改数据的事务已经提交,我在我的事务中才能读到。1.在“可重复读”隔离级别下,这个视图是在事务启动时创建的,整个事务存在期间都用这个视图。原创 2022-07-29 10:09:04 · 1670 阅读 · 2 评论 -
B树和B+树
B树是是二叉树上进行优化的多叉树,因为随着我们数据的增加。二插树它的树高也会越高,每次查询都需要访问过多节点(MySQL的InnoDB存储引擎中,他一次IO读取的数据量大小是16K,而二叉树每次只读取一个节点数据(大约16个字节,占用千分之一),大大消耗浪费读取内存),即访问数据块过多,而从磁盘随机读取数据块过于耗时。所以我们需要减少磁盘的读取,减少IO次数。比如一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数据块。原创 2022-08-08 21:48:17 · 3239 阅读 · 1 评论 -
MySQL索引
什么是覆盖索引呢,比如我们上面的age索引树,它的data存储的是我们的主键索引id,比如我们的SQL语句是(select id from user where age=15),那么我们是不是就可以不用进行回表了呢?非主键索引的叶子节点内容是主键的值。的索引,获取它的data数据,因为当前索引已经覆盖我们查询数据,id,sex,age,phone等数据,所以无需进行回表,直接返回。也就相当于我们建立了(sex)单独索引,(sex,age)联合索引,(sex,age,phone)联合索引。原创 2022-08-14 16:43:42 · 2381 阅读 · 0 评论 -
MySQL有哪些锁
你可以想象一下,如果一个查询正在遍历一个表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果跟表结构对不上,肯定是不行的。什么是全局锁,全局锁就是让数据库处于只读的状态,而在这个状态过程中,整个数据库的(增删改)会被阻塞,整个数据库的定义语句(表的修改,新增,删除)也会被阻塞,包括更新类事务的提交语句。在 InnoDB 事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。读锁是共享锁,加上后其他锁只能读不能写,本线程也不能写。.....原创 2022-08-28 14:48:42 · 4256 阅读 · 1 评论 -
MySQL的change buffer
这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价,这个时候普通索引就不是最好的选择了。而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新操作缓存在 change buffer中,这样就不需要从磁盘中读入这个数据页了。第二种情况是,这个记录要更新的目标页不在内存中。唯一索引,找到 3 和 5 之间的位置,判断到没有冲突,插入这个值,语句执行结束;唯一索引,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结 束;......原创 2022-08-28 15:47:42 · 2414 阅读 · 0 评论 -
MySQL数据库备份(Linux操作系统)
查看定时任务日志出现这个错误 /bin/bash^M: bad interpreter: No such file or directory。在/home/backups/下建立.sh文件,文件名称。#输入以下代码 表示每天01:01自动执行代码。输入crontab -e,开始编辑定时任务。输入:wq 保存退出。查看定时任务执行命令。出现以下表示备份成功。原创 2022-09-03 22:55:12 · 10960 阅读 · 3 评论 -
MySQL的刷脏页策略
当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。 1.当我们修改一条数据时,如果数据在内存中,我们是先会去改内存的,而不是先去改磁盘。假如数据都在内存中,这时候断电了怎么办,服务器宕机怎么办,这个时候就需要我们的redo log了。 在每一条数据更新时,MySQL会先写redo log日志,在去写binlog 日志。在写这两个日志过程中会涉及到**两阶段提交**。他可以保证两个日志逻辑上的一致性。所以即使因为停电,宕机等原因,MySQL也可以通过redo log将数据进行恢复。原创 2022-09-12 13:41:46 · 3742 阅读 · 1 评论 -
MySQL重建表
总所周知MySQL数据结构是B+树,现在假设删除掉r4的记录,InnoDB只会把r4这个记录标记为删除,如果之后插入一条10-20的记录,就会复用这个r4的位置,但是磁盘文件的大小并不会因为标记为删除而减小,类似于假删除。因为,一个表单独存储为一个文件更容易管理,而且在你不需要这个表的时候,通过 drop table 命令,系统就会直接删除这个文件。如果我们把表B作为临时表,数据从表A导入表B的操作完 成后,用表B替换A,从效果上看,就起到了收缩表A空间的作用。因此,在整个DDL过程中,表A中不能有更新。原创 2022-09-17 23:04:20 · 4147 阅读 · 0 评论