Mysql
文章平均质量分 81
light_code
code everyday!
展开
-
MySQL三个日志的作用
使得MySQL有crash-safe的能力。redo log记录了事务执行过程中的修改操作,如果事务提交后MySQL奔溃,重启后可以通过redo log来使数据恢复到最新状态。另外,还使得数据的写操作从随机写变成顺序写。因为redo log是追加写,不同于直接对数据在磁盘上进行的写操作,那样需要在磁盘找到对应的记录,是随机写的。原创 2023-09-15 20:38:03 · 60 阅读 · 0 评论 -
MySQL有哪些锁?
上面出现了两个会话向同一张表同时执行insert语句的情况,因此,可能出现sessionB执行批量插入语句获得主键1,2,接着sessionA执行插入语句获得主键3,然后sessionB继续执行插入语句获得主键4,5,因此,最后sessionB的insert语句,生成的id不连续。但是无论哪个先记录,最后binlog拿去从库执行,由于从库会按照顺序执行,只有执行完一条语句才会执行下一条,因此执行sessionB的insert语句,生成的id是连续的,这时,就会出现主从数据不一致的情况。原创 2023-09-08 16:38:54 · 25 阅读 · 0 评论 -
MySQL有哪些锁?
上面出现了两个会话向同一张表同时执行insert语句的情况,因此,可能出现sessionB执行批量插入语句获得主键1,2,接着sessionA执行插入语句获得主键3,然后sessionB继续执行插入语句获得主键4,5,因此,最后sessionB的insert语句,生成的id不连续。但是无论哪个先记录,最后binlog拿去从库执行,由于从库会按照顺序执行,只有执行完一条语句才会执行下一条,因此执行sessionB的insert语句,生成的id是连续的,这时,就会出现主从数据不一致的情况。原创 2023-09-06 22:41:50 · 30 阅读 · 0 评论 -
可重复读级别下,还可能出现的幻读情况?
当A事务开启事务后进行查询id为xxx比如5的记录,发现不存在这条记录,但是另一个B事务开启然后插入了一条id为5的记录并提交。for update,它们也是当前读。这样,A事务更新id为5的记录后,由于事务自己更新的记录自己总是可见,因此当A事务再次查询时会发现这次能够查到id为5的记录了。事务A开启后执行一条快照读查询id为5的记录发现不存在,然后另一个事务B开启然后插入一条id为5的记录并提交,接着A事务通过当前读再次查询发现可以查到id为5的记录。原创 2023-08-27 21:50:16 · 312 阅读 · 0 评论 -
事务的隔离级别怎么实现的?
读未提交:一个事务还没提交,它所做的变更就能被其它事务看到读提交:一个事务提交之后,它所做的变更才能被其它事务看到可重复读(MySQL默认事务隔离级别):一个事务执行过程中看到的数据和这个事务启动时看到的数据是一样的,只有当前事务提交之后重新开启,才能看到最新的数据串行化:对记录加上读写锁,当多个事务对该记录进行读写操作时,如果发生读写冲突,后访问的事务必须等待前一个事务完成,才能继续执行读提交之上解决了读未提交的问题可重复读之上解决了不可重复读和读未提交的问题,很多程度解决幻读问题。原创 2023-08-24 21:16:17 · 77 阅读 · 0 评论 -
count()和count(1)的区别?
性能由大到小:count(*) = count(1) > 遍历二级索引的count(索引字段) > 遍历 主键索引的count(索引字段) > count(普通字段)原创 2023-08-22 21:36:27 · 36 阅读 · 0 评论 -
索引什么时候会失效?
因为联合索引的B+树的排序规则是,先按照最左的第一列的字段排序,第一列数据相同时,才会按照第二列的字段排序。所以,为了尽可能地使用到联合索引中更多的列,我们where条件中的列必须是从联合索引中最左边的列开始连续的列(当然,其实有查询优化器的存在,只要最左边的列存在,则会走索引,至于使用到多少个字段,就要看where条件中是否包含其它列了)当我们再添加一个age字段,不过age字段没有建立索引,这个时候因为不满足最左匹配原则并且查询的字段并不都包含在二级索引当中,这个时候就会走全表扫描。原创 2023-08-22 20:37:50 · 30 阅读 · 0 评论 -
索引什么时候会失效?
因为联合索引的B+树的排序规则是,先按照最左的第一列的字段排序,第一列数据相同时,才会按照第二列的字段排序。所以,为了尽可能地使用到联合索引中更多的列,我们where条件中的列必须是从联合索引中最左边的列开始连续的列(当然,其实有查询优化器的存在,只要最左边的列存在,则会走索引,至于使用到多少个字段,就要看where条件中是否包含其它列了)上图说明MySQL会隐式地将字符串“10”转换成10,否则,如果将9转换成“9”,两个数字字符串进行比较,从高位至低位比较,这时1 < 9则select结果为0才对。原创 2023-08-21 21:34:02 · 32 阅读 · 0 评论 -
从数据页的角度看B+树
InnoDB是以数据页为单位来读写数据的,数据页大小默认是16KB,每次从磁盘最少读取16KB的数据到内存,或者刷新内存中16KB的数据到磁盘。InnoDB采用了B+树进行索引,B+树中的每一个节点都是一个数据页。原创 2023-08-20 21:31:38 · 26 阅读 · 0 评论 -
为什么MySQL采用B+树作为索引?
这样就造成在查找某个节点或者记录的过程中需要更多的磁盘IO去从磁盘读取记录的数据到内存。而且,如果我们采用B树进行范围查询,肯定需要进行中序遍历,但是这也会涉及多个节点的磁盘IO问题。二叉搜索树上每一个节点的左子树上节点的大小都比该节点小,右子树上节点大小都比该节点大。B树则改进了二叉树只有两个分支的问题,它是一个多叉树,每个节点可以有大于2个的节点,这样整个树的高度就得到了下降。,当数据是按照大小顺序插入的时候,插入的时间复杂度为O(N),而我们在检索每一个节点的时候都会涉及一次磁盘IO,也就是会。原创 2023-08-20 21:30:36 · 22 阅读 · 0 评论 -
索引基础知识
帮助存储引擎快速获取数据的一种数据结构,具体来说,索引是数据的目录就像一本的目录一样。它体现了一种以空间换时间的设计思想。存储引擎:实现了对数据的存储、更新和查询并为数据建立索引。存储引擎有很多,常见的有MyISAM、InnoDB、Mermory。MySQL5.5之后,InnoDB成为默认的存储引擎。原创 2023-08-19 23:27:02 · 49 阅读 · 0 评论 -
MySQL一行记录是怎么存储的?
区:B+树的每一层上的数据页都是通过双向链表连接起来的,但是他们只是逻辑上相邻,实际物理上并不相邻,这样就会造成我们在进行磁盘查询的时候,会有很多的随机IO,而随机IO是很耗时的。记录行是存放在数据页中的,一个数据页的大小是16KB,也就是16384字节,而一个varchar(n)类型的列最多可以存储65533个字节,一些大对象如blob、text可能存储更大的数据,这时一个数据页可能存不下一行记录,就会发生行溢出,溢出的数据就会存放在溢出页中。页的类型很多,不仅有数据页,也有undo日志页、溢出页等。原创 2023-08-17 22:24:17 · 136 阅读 · 1 评论 -
执行一条select语句期间发生了什么?
在MySQL8.0之前,执行SQL语句的时候,MySQL会先解析SQL语句的第一个字段,如果发现是select查询语句,则会先去查询缓存中查找是否有这题查询语句,查询缓存相当于一个map,k是查询语句,v是查询结果,如果有这个k,则直接返回v。,server层的执行器调用索引查询的接口,存储引擎会去定位符合主键查询条件的第一条记录,然后返回给执行器,执行器判断是否符合查询的条件,符合则直接返回给客户端。存储引擎层负责实现索引数据结构,不同的存储引擎支持的索引类型不同,InnoDB支持的索引类型是B+树。原创 2023-08-16 20:52:24 · 72 阅读 · 1 评论 -
MySQL内存篇
因此,MySQL在加载数据页时,会将其相邻的数据页一起加载进Buffer Pool中,那么这些被提前加载进来的数据页就会被加入LRU链表的头节点,但是,如果这些被提前加载进来的数据页一直没被访问,反而因为占用链表头部区域,会将LRU链表中那些热点数据页淘汰,从而使得缓存命中率大大下降。我们将预读页插入到old区域的头部,将真正要读取的页插入到young区域,old区域中的预读页只有在被使用的时候,才会被移动到young区域头部,而如果old区域的预读页一直没有被访问,就会因为新的预读页插入而被淘汰。原创 2023-08-15 22:28:38 · 99 阅读 · 1 评论 -
深入浅出--Mysql的三种日志
当write_pos追上check_point时,redo log写满,mysql会被阻塞,此时不能再进行写操作,这时会停下来将buffer pool中的脏页刷新到磁盘,接着,既然脏页中的记录已经落盘,就可以擦除redo中的一些记录,check_point也向后顺时针移动,这样,write_pos与check_point之间就有了可以写入的空间。接着,从库的IO线程会通过连接主库的log dump线程,读取主库的binlog日志并将读取到的数据写入到从库的relay log中继日志中,原创 2023-05-31 22:52:47 · 1718 阅读 · 1 评论 -
B+树深入探究
索引可以分为聚集索引与二级索引,它们的区别在于叶子结点存放的是什么数据,对于聚集索引,叶子结点存放的是完整的用户记录,而二级索引中叶子节点存放的是记录的主键。文件头包含两个指针,一个指向上一个数据页,一个指向下一个数据页,连接起来的数据页相当于一个双向链表,这样,数据页不一定需要物理上的连续,只是逻辑上的连续。,将槽指向的记录组的最大记录的主键与查找的记录的主键进行对比,直到查找到记录对应的槽。数据的存储是按照“行”存储的,但是数据库的读取是以“页”的方式。当查找某条记录的时候,会先根据索引键大小,采用。原创 2023-05-21 12:10:01 · 45 阅读 · 1 评论 -
Mysql5.5在进行数据导入时出现异常?如何升级mysql版本?
Mysql5.5在导入数据的时候可能会出现索引字段过长的情况,导致不支持,需要升级到5.7。3. 复制mysql-5.7.21-winx64的bin路径到path下。2.下载完成会解压,在mysql安装目录下创建my.ini文件。# 服务端使用的字符集默认为8比特编码的latin1字符集。1.到官网下载想要的对应版本的mysql安装包。# 设置mysql数据库的数据的存放目录 (# 创建新表时将使用的默认存储引擎。二、下载要更换的对应版本的mysql。# 设置mysql的安装目录(原创 2023-05-07 11:31:56 · 75 阅读 · 1 评论 -
Mysql默认的隔离级别“可重复读”是如何解决幻读问题的,完全解决了吗?
mysq的默认隔离级别是如何解决幻读问题的?原创 2023-05-06 20:29:56 · 540 阅读 · 1 评论 -
Mysql事务隔离级别是如何实现的?
Mysql中事务的隔离级别是如何实现的?原创 2023-05-06 20:39:46 · 444 阅读 · 0 评论