首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

mysql物理读 逻辑读

MySQL物理读与逻辑读基础概念

物理读(Physical Read): 物理读是指从磁盘上读取数据页到内存中的过程。当MySQL需要访问的数据不在内存中时,会发生物理读。物理读通常涉及磁盘I/O操作,因此速度较慢。

逻辑读(Logical Read): 逻辑读是指从内存中的数据页读取数据的过程。当MySQL需要访问的数据已经在内存中时,会发生逻辑读。逻辑读的速度通常比物理读快得多。

相关优势

  • 物理读的优势
    • 数据持久化:物理读确保数据存储在磁盘上,即使系统崩溃,数据也不会丢失。
    • 数据恢复:通过物理备份和恢复机制,可以快速恢复大量数据。
  • 逻辑读的优势
    • 高性能:逻辑读直接从内存中读取数据,避免了磁盘I/O操作,因此速度更快。
    • 减少延迟:逻辑读减少了数据访问的延迟,提高了系统的响应速度。

类型

  • 物理读的类型
    • 全盘扫描:读取整个数据文件。
    • 索引扫描:根据索引信息读取特定的数据页。
  • 逻辑读的类型
    • 缓存读取:从InnoDB缓冲池中读取数据。
    • 行读取:从内存中的数据页中读取单行数据。

应用场景

  • 物理读的应用场景
    • 数据库恢复:在系统崩溃或数据损坏时,需要从磁盘上读取数据进行恢复。
    • 大数据量处理:当处理的数据量超过内存容量时,需要从磁盘上读取数据。
  • 逻辑读的应用场景
    • 高并发查询:在高并发环境下,频繁的查询操作主要依赖逻辑读来提高性能。
    • 实时数据分析:实时数据分析通常需要快速访问内存中的数据。

常见问题及解决方法

问题1:为什么MySQL物理读次数过多?

原因

  • 数据库缓存不足,导致频繁从磁盘读取数据。
  • 查询语句复杂,涉及大量数据页。
  • 磁盘I/O性能瓶颈。

解决方法

  • 增加InnoDB缓冲池大小,确保更多数据可以缓存在内存中。
  • 优化查询语句,减少不必要的数据读取。
  • 提升磁盘I/O性能,例如使用SSD硬盘或RAID配置。

问题2:如何减少MySQL逻辑读次数?

原因

  • 查询语句未充分利用索引。
  • 数据库表数据量过大,导致内存无法完全缓存。
  • 数据库配置不合理,导致缓存命中率低。

解决方法

  • 优化查询语句,确保充分利用索引。
  • 分表分库,减少单表数据量,提高缓存命中率。
  • 调整数据库配置,例如增加InnoDB缓冲池大小,优化缓存策略。

示例代码

假设我们有一个简单的查询语句:

代码语言:txt
复制
SELECT * FROM users WHERE age > 30;

为了减少物理读和逻辑读次数,可以采取以下措施:

  1. 创建索引
  2. 创建索引
  3. 优化查询语句
  4. 优化查询语句

通过创建索引和优化查询语句,可以显著减少物理读和逻辑读次数,提高查询性能。

参考链接

希望以上信息对你有所帮助!

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

SQL Server 中的逻辑读与物理读

首先要理解逻辑读和物理读:   预读:用估计信息,去硬盘读取数据到缓存。预读100次,也就是估计将要从硬盘中读取了100页数据到缓存。   ...物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘。物理读10页,从硬盘中读取10页数据到缓存。   逻辑读:从缓存中取出所有数据。...所以SQL Server对于逻辑读、预读、物理读的单位是页。...我们可以通过公式大概推算出占用了多少页:2032*1024/8060(每页的数据容量)≈258- 表中非数据占用的空间≈290(上图中的逻辑读取数) 基本上,逻辑读、物理读、预读都等于是扫描了多少个页...查询计划生成好了以后去缓存读取数据,当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读),然后从缓存中取出所有数据(逻辑读)。

82920

SQL Server 中的逻辑读与物理读

首先要理解逻辑读和物理读:   预读:用估计信息,去硬盘读取数据到缓存。预读100次,也就是估计将要从硬盘中读取了100页数据到缓存。   ...物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘。物理读10页,从硬盘中读取10页数据到缓存。   逻辑读:从缓存中取出所有数据。...所以SQL Server对于逻辑读、预读、物理读的单位是页。 示例: ? ?      ...我们可以通过公式大概推算出占用了多少页:2032*1024/8060(每页的数据容量)≈258- 表中非数据占用的空间≈290(上图中的逻辑读取数)       基本上,逻辑读、物理读、预读都等于是扫描了多少个页...查询计划生成好了以后去缓存读取数据,当发现缓存缺少所需要的数据后让缓存再次去读硬盘(物理读),然后从缓存中取出所有数据(逻辑读)。

1.6K90
  • mysql脏读、幻读、不可重复读

    脏读:有个英雄表如下图所示图片第一天 小张 往里面插入数据:BEGIN;INSERT INTO heros_temp values(4, '吕布');小张还没有提交事务的时候,小李对数据表进行了访问,小张看到的结果如下图片小李读到了小张还没有提交的数据...,我们称之为“脏读”不可重复读小张想查看 id=1 的英雄是谁,于是他进行了 SQL 查询:SELECT name FROM heros_temp WHERE id = 1;图片然而此时,小李开始了一个事务操作...幻读小张想要看下数据表里都有哪些英雄图片这时当小张执行完之后,小李又开始了一个事务,往数据库里插入一个新的英雄“吕布”BEGIN;INSERT INTO heros_temp values(4, '吕布...这种异常情况我们称之为“幻读”。总结脏读:读到了其他事务还没有提交的数据。不可重复读:对某数据进行读取,发现两次读取的结果不同,也就是说没有读到相同的内容。...幻读:事务 A 根据条件查询得到了 N 条数据,但此时事务 B 更改或者增加了 M 条符合事务 A 查询条件的数据,这样当事务 A 再次进行查询的时候发现会有 N+M 条数据,产生了幻读。

    81250

    Mysql 脏读、不可重复读、幻读

    在Mysql中常用的InndDB是支持并发事务的,也就是能够在同一时间允许多个事务对数据库进行操作,那么问题来了,如果一个事务在写数据,另一个事务要读数据会发生什么;如果一个事务在写数据,另一个事务也要写又会发生什么...具体来说,这就有可能产生脏读、不可重复读和幻读。事务是逻辑上的一组操作,要么全部执行,要么全部不执行脏读一个事务读取到了另一个未提交事务修改的数据。...这里我们有个学生表,初始时有8条数据:事务A在插入前先去看了下不存在主键为9的数据,符合正常逻辑。事务B直接插入了一条主键为9的数据并提交了事务。...事务隔离级别为了解决上面问题,Mysql为我们提供了4种事务隔离级别来解决。隔离级别逐渐上升,性能逐渐下降。...Mysql的默认隔离级别,避免了“脏读取”和“不可重复读取”的情况,但不能避免“幻读”。Serializable (串行化):一个事务处理的时候,其他事务都等着。

    18910

    MySQL事务(脏读、不可重复读、幻读)

    是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元); 2.事务的四大特性ACID...3.创建事务的SQL语法 隐式事务:事务没有明显的开启或者结束的标志,在mysql中,默认是开启自动提交的 SHOW @@autocommit;   所以针对SELECT、UPDATE、DELETE...、INSERT等DQL及DML语句的执行,mysql会自动提交该事务,如果关闭就需要手动提交或者回滚来完成操作。...注意:在事务中使用truncate时,就算rollback也会清空整张表 4.多个事务在不同事务隔离级别下的并发问题   在mysql下事务的隔离级别有四种且由低到高依次为Read uncommitted...脏读的情况:对于两个事务T1与T2,T1读取了已经被T2更新但是还没有提交的字段之后,若此时T2回滚,T1读取的内容就是临时并且无效的   开启两个mysql客户端,并创建一张测试表transaction

    1.1K10

    Mysql脏读、幻读、不可重复读(二)

    Mysql脏读、幻读、不可重复读引言在数据库领域中,脏读、幻读和不可重复读是常见的问题,特别是在并发操作的环境下。本文将详细介绍这三个问题的定义、原因以及如何通过Mysql来解决它们。1....脏读(Dirty Read)脏读指的是一个事务读取到了另一个事务未提交的数据。当一个事务修改数据但还没有提交时,另一个事务读取到了这个未提交的数据,并做出了相应的操作。...事务2在事务1未提交的情况下读取到了这条记录,导致脏读的问题。2....幻读(Phantom Read)幻读指的是一个事务在读取某个范围内的记录时,另一个事务在该范围内插入了新的记录,导致第一个事务再次读取到了该范围内的新记录,就像幻觉一样。...当事务1再次读取数据时,发现又多了一条记录,这就是幻读的问题。3.

    25900

    【MySQL】MySQL事务的问题:脏读、幻读、不可重复读

    MySQL事务的问题:脏读、幻读、不可重复读 在上一篇文章中,我们已经学习过了事务相关的基础知识,今天,我们继续学习事务有可能带来的一些问题。...-- my.cnf [server] transaction-isolation = READ-UNCOMMITTED 脏读 脏读的意思就是两个事务同时在运行,其中 A 事务修改了某个字段,B 事务读取了这个字段...很明显,这就产生了问题,这个就是脏读带来的结果,一致性出现了问题。 不可重复读 不可重复读是啥意思呢?...; +----------+ | username | +----------+ | aaa | +----------+ 1 row in set (0.00 sec) 幻读 最后一个幻读...确实,它们非常类似,但是,幻读更强调的是聚合操作结果,而不是单一一条数据的修改,这就是它们两个之间最本质的区别。

    20810

    MySQL的脏读、幻读、不可重复度是什么

    什么是脏读脏读又称为无效数据读取,指在数据库访问中,事务T1修改了某个数值,随后事务T2读取了该数值,而后因某种原因,T1撤销了对该数值的修改,导致T2读取到的数据变为无效。...什么是幻读幻读是指在事务非独立执行时出现的现象,举例来说,第一个事务对表中的数据进行了修改,涉及到表中的“全部数据行”。与此同时,第二个事务也修改了该表的数据,插入了“一行新数据”。...一般解决幻读的方法是通过增加范围锁(RangeS),将检测锁的范围限定为只读,这样便可以避免幻读的发生。...值得注意的是,幻读是不可重复读的一种特殊情况:在事务没有获取范围锁的情况下执行SELECT … WHERE操作时可能会导致幻读现象的发生。...)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。

    11310

    ✅MySQL的脏读、幻读、不可重复度是什么

    什么是脏读脏读又称为无效数据读取,指在数据库访问中,事务T1修改了某个数值,随后事务T2读取了该数值,而后因某种原因,T1撤销了对该数值的修改,导致T2读取到的数据变为无效。...什么是幻读幻读是指在事务非独立执行时出现的现象,举例来说,第一个事务对表中的数据进行了修改,涉及到表中的“全部数据行”。与此同时,第二个事务也修改了该表的数据,插入了“一行新数据”。...一般解决幻读的方法是通过增加范围锁(RangeS),将检测锁的范围限定为只读,这样便可以避免幻读的发生。...值得注意的是,幻读是不可重复读的一种特殊情况:在事务没有获取范围锁的情况下执行SELECT … WHERE操作时可能会导致幻读现象的发生。...)、可重复读(Repeatable reads)、提交读(Read committed)、未提交读(Read uncommitted)。

    57210

    带你读 MySQL 源码:select *

    本文内容基于 MySQL 8.0.32 源码。正文1. 整体介绍对于 select * from table 中的星号,我们再熟悉不过了:它告诉 MySQL 返回表所有字段的内容。...MySQL 服务端收到 select 语句之后,会在 server 层把星号展开为表中的所有字段,然后告诉存储引擎返回这些字段的内容。...如果 with_wild 大于 0,则调用 setup_wild(thd),处理 select 字段列表中星号展开为表中所有字段的逻辑。...select 字段列表中的每个字段,遇到星号就处理,不是星号就忽略,星号的处理逻辑有 2 种:第 1 种:满足 if (subsel && ...)...这个逻辑是 server 层自主实现的,和 select * 中的星号展开为表中所有字段的逻辑不相关,我们知道有这个逻辑就可以,不展开介绍了。第 2 种:不满足 if (subsel && ...)

    62100

    MYSQL事件隔离级别以及复读,幻读,脏读的理解

    一.mysql事件隔离级别 1未提交读(READUNCOMMITTED) 另一个事务修改了数据,但尚未提交,而本事务中的SELECT会读到这些未被提交的数据(脏读)( 隔离级别最低,并发性能高 ) 2.....提交读(READCOMMITTED) 本事务读取到的是最新的数据(其他事务提交后的)。...但是,会有幻读现象(稍后解释)。...会出幻读(锁定所读取的所有行) 4.串行化(SERIALIZABLE) 读操作会隐式获取共享锁,可以保证不同事务间的互斥(锁表) 二.脏读、不可重复读、幻读、复读 1.脏读 当前事务读到的数据是别的事务想要修改成为的但是没有修改成功的数据...2.不可重复读 当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配,也就照应了不可重复读的语义 3.幻读 当前事务读第一次取到的数据比后来读取到数据条目少或者增加

    72910

    【MySQL入门】之细说脏读、幻读及不可重复读

    二、事务的提交和回滚 #事务的提交 mysql> start transaction;#手动开启事务 mysql> insert into t_test(name) values(‘jack’); mysql...herry| | 2 | jack | +----+------+ 2 rows in set (0.00 sec) #事务的回滚 mysql> start transaction;#手动开启事务 mysql...> insert into t_test(name) values(‘jack’); mysql> rollback;#代表事务回滚 mysql> select * from t_test; +----...隔离级别 脏读 不可重复读 幻读 读未提交(Read uncommitted) 可能 可能 可能 读已提交(Read committed) 不可能 可能 可能 可重复读(Repeatable read)...这种情况也叫不可重复读,允许幻读的发生,是oracle数据库的默认隔离级别。 3. Repeatable Read(重复读) mysql的默认级别。

    86310

    Mysql幻读如何解决

    幻读也是在面试中经常被问到的,今天我们按照下面几个方面讲解 幻读是什么 幻读有什么问题 如何解决幻读 首先我们建立我们的表,且插入6条数据,如下图 CREATE TABLE `t` ( `id` int...sessionC插入id=1这行数据,Q3返回id=0,1,5 这里Q3读到id=1这行数据就是幻读,幻读是指在一次事务中,前后两次相同的范围查询,看到了不一样的数据。...在可重复读级别下,普通查询是读取快照读,不可以看到其他事物中的插入的数据,只有当前读,才会有幻读 上面的Q2不是幻读,他是当前读,幻读是针对新插入行 幻读有什么问题 破坏语义 sessionA中T1select...一致性问题 数据的一致性不仅仅是数据此刻的一致性,也包括数据和日志上的逻辑一致性,如我们在sessionA上加上下面语句. update t set d=100 where d=5。...,答案是有的,Mysql默认的事物隔离级别是可重复读,但是如何我们把事物设置成读已提交和binlog_format=row,也是可以解决幻读的问题,当然要这样配置是否合理要看你们的业务场景.

    98820

    MySQL如何解决幻读

    关于当前读可以见MySQL MVCC(多版本控制)这篇文章。...Q3读到id=1这一行的现象成为幻读。幻读是指一个事务在前后两次查询同一个范围的数据的时候,后一次查询查到了第一次查询没有查到的行。...在可重复隔离级别下,普通的查询是快照读,是无法看到别的事务插入的数据的,只有当前读才会出现幻读。 幻读有什么问题? 语义上带来了破坏。...如何解决幻读? 产生幻读的原因就是行锁只能锁住行,插入动作更新的是记录之间的间隙。因此为了解决幻读问题,InnoDB引入了间隙锁。 什么是间隙锁?...间隙锁是在可重复读隔离级别下才会生效,如果将隔离级别设置为读提交,就不会有间隙锁了,但是同时需要解决数据和日志不一致的问题(需要把binlog格式设置为ROW)。

    47330

    带你读 MySQL 源码:limit, offset

    我一直想写 MySQL 源码分析文章,希望能够达成 2 个目标: 不想研究源码的朋友,可以通过文章了解 MySQL 常用功能的实现逻辑,做到知其然,也知其所以然。...想研究源码的朋友,能够以文章为切入点,迈进 MySQL 源码研究之门。 目标是明确的,任务是艰巨的。 MySQL 源码数量庞大,各种功能的代码盘根错节,相互交织在一起,形成一张复杂的网。...对 MySQL 源码感兴趣的朋友们,如果想看到源码分析系列的更多文章,请帮忙把文章传播出去,分享给更多人。...每篇文章只会介绍核心源码逻辑,源码之中增加注释,源码之外尽可能用文字展开介绍源码逻辑,以帮助大家更好的理解源码。 每篇文章不会太长,如果功能复杂导致内容太长,我会拆分文章,尽量降低大家的阅读负担。...本文内容基于 MySQL 8.0.32 源码。 正文 1.

    97130

    mysql事务隔离级别脏读不可重复读幻读详解

    但是有些业务场景,比如会员系统中,如果要在一个事务中,多次读取用户身份,判断是否会员,如果刚开始读取到该用户是会员,做了一些逻辑处理,后面又读到用户不是会员了,这就有点崩溃,不知道如何继续。...二、脏读/不可重复读/幻读 2.1 脏读 ? 验证: a. 找一个mysql环境,建一个测试表t_people,就2列 id ,name b....开二个mysql终端,连到db上,为方便讲解,这2个终端称为“终端1”、“终端2”,终端1里输入: set session transaction isolation level read uncommitted...2.4 串行化 从db层面,要想同时解决脏读、不可重复读、幻读,只有串行化这个级别可以做到。...小结: 隔离级别 存在的问题 读未提交 脏读、不可重复读、幻读 读已提交 不可重复读、幻读 可重复读 幻读 串行化 性能问题 隔离级别越严格,db综合性能越低。

    1.1K20

    脏读

    为什么需要避免脏读? 脏读需要被避免,因为它会导致数据的不一致性。如果一个事务依赖于另一个事务尚未提交的数据,它可能会做出错误的决策或计算。...脏读的实现原理? 脏读是并发控制中的一个现象,其实现原理与数据库的事务隔离级别密切相关。...脏读的优点 在大多数情况下,脏读并没有优点,因为它通常会导致数据的不一致性。然而,可以认为在某些非常特定的场景中,允许脏读可以提高数据库的并发性能。 6....脏读的缺点 数据不一致:可能会读到最终不会提交的数据。 错误的决策:基于错误数据做出的决策可能导致业务逻辑出错。...谨慎操作:在可能涉及脏读的操作中要特别小心,确保业务逻辑可以容忍这种不确定性。 系统设计:在系统设计时考虑并发访问的问题,避免业务逻辑上依赖于可能发生脏读的数据。 8.

    24540

    MySQL InnoDB如何解决幻读?

    因此,幻读在“当前读”才会出现。SB修改结果被SA之后的select语句用“当前读”看到,不能称为幻读。幻读仅专指新插入的行而非更新。 这三查询都加for update,都是当前读。...而这一致性,不止是DB内部数据状态在此刻的一致性,还包含数据和日志在逻辑上的一致性。 给SA在T1时刻再加一个更新语句,即:update t set d=100 where d=5。...5 InnoDB解决幻读 5.1 幻读的原因 行锁只能锁行,但新插入记录这个动作,要更新的是已有记录之间的“间隙”。因此,为解决幻读,InnoDB需引入间隙锁(Gap Lock),锁住两值之间的空隙。...6.3 分析 该逻辑一旦有并发,就可能死锁。可这逻辑每次操作前用for update锁了,已是最严格模式,怎么还能死锁? 6.4 模拟-间隙锁导致的死锁 两个session并发,假设N=9。...若都用RC,可逻辑备份时,mysqldump为何要把备份线程设置成RR?然后,在备份期间,备份线程用RR,而业务线程用RC。同时存在两种事务隔离级别,会有问题吗?

    76920
    领券