文章地址 什么是幻读? 幻读是指在同一个事务中,存在前后两次查询同一个范围的数据,但是第二次查询却看到了第一次查询没看到的行。 幻读出现的场景 在可重复读隔离级别下,普通的查询是快照读,是不会看到别的事务插入的数据的。因此,幻读在“当前读”下才会出现。 幻读仅专指“新插入的行”,不是“修改后的行”。
文章地址 加锁规则 MySQL 后面的版本可能会改变加锁策略,所以这个规则只限于 5.x 系列 <=5.7.24,8.0 系列 <=8.0.13。 两个“原则”、两个“优化”和一个“bug” 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间。 原则
文章地址主备延迟与数据同步有关的时间点主要包括以下三个:主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;备库 B 执行完成这个事务,我们把这个时刻记为 T3。所谓主备延迟,就是同一个事务,在备库执
文章地址如果对字段做了函数计算或数学运算,MySQL 无法再使用索引快速定位功能,而只能使用全索引扫描。对索引字段做函数操作,可能会破坏索引值的有序性,因此优化器就决定放弃走树搜索功能。在 MySQL 中,字符串和数字做比较的话,是将字符串转换成数字。
文章地址show processlist 命令可以查看语句的执行状态,当语句长时间无响应时可以使用此命令排查原因Waiting for table metadata lock这个状态表示的是,现在有一个线程正在表上请求或者持有 MDL 写锁,把 select 语句堵住了。通过查询 sys.schem
文章地址MySQL 的表是用什么方法来定位“一行数据”的?如果你创建的表没有主键,或者把一个表的主键删掉了,那么 InnoDB 会自己生成一个长度为 6 字节的 rowid 来作为主键。rowid 是每个引擎用来唯一标识数据行的信息。对于有主键的 InnoDB 表来说,这个 rowid 就是主键 I
文章地址MySQL会为每个线程分配一个内存(sort_buffer)用于排序,该内存大小为sort_buffer_size如果排序的数据量小于sort_buffer_size,排序将会在内存中完成如果排序数据量很大,内存中无法存下这么多数据,则会使用磁盘临时文件来辅助排序,也称外部排序在使用外部排序
文章地址在不同的 MySQL 引擎中,count(*) 有不同的实现方式MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个数,效率很高;InnoDB 引擎执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。为什么 Inno
文章地址为什么删除了表的一半数据,表文件大小没变化?因为delete 命令其实只是把记录的位置,或者数据页标记为了“可复用”,但磁盘文件的大小是不会变的。也可以认为是一种逻辑删除,所以物理空间没有实际释放表的数据信息存在哪里?表数据信息可能较小也可能巨大无比,它可以存储在共享表空间里,也可以单独存储
文章地址总结:优化器的逻辑优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句。优化器会根据扫描行数、是否使用临时表、是否排序等因素进行综合判断,评估每个索引的执行代价。扫描行数是怎么判断的?MySQL根据统计信息来估算记录数。一个索引上不同的值的个数,我们称之为“基数”(car