MySql
文章平均质量分 96
lix2560
联系博主WX: l2560i 邮箱:l2560i@163.com
展开
-
学习日志:MySQL 记录锁+间隙锁可以防止删除操作而导致的幻读吗?
当同一个查询在不同的时间产生不同的结果集时,事务中就会出现所谓的幻象问题。例如,如果 SELECT 执行了两次,但第二次返回了第一次没有返回的行,则该行是“幻像”行。举个例子,假设一个事务在 T1 时刻和 T2 时刻分别执行了下面查询语句,途中没有执行其他任何语句:只要 T1 和 T2 时刻执行产生的结果集是不相同的,那就发生了幻读的问题,比如:T1 时间执行的结果是有 5 条行记录,而 T2 时间执行的结果是有 6 条行记录,那就发生了幻读的问题。原创 2024-08-03 11:29:04 · 646 阅读 · 0 评论 -
学习日志:update 没加索引会锁全表
在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩了为什么会发生这种的事故?又该如何避免这种事故的发生?说个前提,接下来说的案例都是基于 InnoDB 存储引擎,且事务的隔离级别是可重复读。不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。原创 2024-08-03 11:06:42 · 991 阅读 · 0 评论 -
学习日志:mysql加锁
当查询的记录是「存在」的,在索引树上定位到这一条记录后,将该记录的索引中的 next-key lock 会退化成「记录锁」。当查询的记录是「不存在」的,在索引树找到第一条大于该查询记录的记录后,将该记录的索引中的next-key lock 会退化成「间隙锁」。当查询的记录「存在」时,由于不是唯一索引,所以肯定存在索引值相同的记录,于是非唯一索引等值查询的过程是一个扫描的过程,直到扫描到第一个不符合条件的二级索引记录就停止扫描,然后。原创 2024-08-03 10:46:26 · 876 阅读 · 0 评论 -
学习日志:MySQL 的锁
在 MySQL 里,根据加锁的范围,可以分为全局锁、表级锁和行锁三类。原创 2024-08-02 14:19:31 · 1095 阅读 · 0 评论 -
学习日志:MySQL 可重复读隔离级别,处理幻读
针对快照读(普通 select 语句),是通过 MVCC方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。原创 2024-08-02 10:24:18 · 742 阅读 · 0 评论 -
学习日志:事务隔离级别
转账这一动作在程序里会涉及到一系列的操作,假设我向你转账 100 万的过程是有下面这几个步骤组成的:可以看到这个转账的过程涉及到了两次修改数据库的操作。假设在执行第三步骤之后,服务器忽然掉电了,就会发生一个蛋疼的事情,我的账户扣了 100 万,但是钱并没有到你的账户上,也就是说这 100 万消失了!要解决这个问题,就要保证转账业务里的所有数据库的操作是不可分割的,要么全部执行成功 ,要么全部失败,不允许出现中间状态的数据。数据库中的「事务(Transaction)」就能达到这样的效果。原创 2024-08-02 09:40:38 · 861 阅读 · 0 评论 -
学习日志:不同的count 性能
当我们对一张数据表中的记录进行统计的时候,习惯都会使用 count 函数来统计,但是 count 函数传入的参数有很多种,比如 count(1)、count(*)、count(字段) 等。原创 2024-08-01 15:06:42 · 644 阅读 · 0 评论 -
学习日志:索引失效
常见的 6 种会发生索引失效的场景。当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx%这两种方式都会造成索引失效;当我们在查询条件中对索引列使用函数,就会导致索引失效。当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。原创 2024-08-01 14:26:10 · 743 阅读 · 0 评论 -
学习日志:MySQL 采用 B+ 树作为索引
MySQL 采用 B+ 树作为索引不单单要从数据结构的角度出发,还要考虑磁盘 I/O 操作次数,因为 MySQL 的数据是存储在磁盘中的。MySQL 是会将数据持久化在硬盘,而存储功能是由 MySQL 存储引擎实现的,所以讨论 MySQL 使用哪种数据结构作为索引,实际上是在讨论存储引使用哪种数据结构作为索引,InnoDB 是 MySQL 默认的存储引擎,它就是采用了 B+ 树作为索引的数据结构。原创 2024-08-01 11:30:16 · 829 阅读 · 0 评论 -
学习日志:从数据页的角度看 B+ 树
从数据页的角度看 B+ 树,看看每个节点长啥样。InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16 KB。每个数据页之间通过双向链表的形式组织起来,物理上不连续,但是逻辑上连续。数据页内包含用户记录,每个记录之间用单向链表的方式组织起来,为了加快在数据页内高效查询记录,设计了一个页目录,页目录存储各个槽(分组),且主键值是有序的,于是可以通过二分查找法的方式进行检索从而提高效率。为了高效查询记录所在的数据页,InnoDB 采用 b+ 树作为索引,每个节点都是一个数据页。原创 2024-08-01 11:05:25 · 599 阅读 · 0 评论 -
学习日志:索引
从索引的基本原理,再到索引的使用场景索引底层使用了什么数据结构和算法?为什么 MySQL InnoDB 选择 B+tree 作为索引的数据结构?什么时候适用索引?什么时候不需要创建索引?什么情况下索引会失效?有什么优化索引的方法?这次主要介绍了索引的原理、分类和使用。我把重点总结在了下面这个表格。原创 2024-08-01 10:32:15 · 810 阅读 · 0 评论 -
学习日志:MySQL 一行记录的存储结构
MySQL 的 NULL 值会占用空间吗?MySQL 怎么知道 varchar(n) 实际占用数据的大小?varchar(n) 中 n 最大取值为多少?行溢出后,MySQL 是怎么处理的?这些问题看似毫不相干,其实都是在围绕「 MySQL 一行记录的存储结构」这一个知识点,所以攻破了这个知识点后,这些问题就引刃而解了。MySQL 的 NULL 值是怎么存放的?原创 2024-07-31 11:15:19 · 900 阅读 · 0 评论 -
学习日志:MySql的执行流程
MySQL 执行一条 select 查询语句,在 MySQL 中期间发生了什么?执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。优化阶段。原创 2024-07-31 10:15:19 · 998 阅读 · 0 评论