MySQL 全表扫描

2023-11-02

Server层

-- db1.t有200GB
mysql -h$host -P$port -u$user -p$pwd -e "select * from db1.t" > $target_file

查询数据

在这里插入图片描述

  1. InnoDB的数据是保存在主键索引上,全表扫描实际上是直接扫描表t的主键索引
  2. 获取一行,写到net_buffer中,默认为16K,控制参数为net_buffer_length
  3. 重复获取行,直到写满net_buffer,然后调用网络接口发出去
  4. 如果发送成功,就清空net_buffer,然后继续取下一行并写入net_buffer
  5. 如果发送函数返回EAGAIN或者WSAEWOULDBLOCK,表示本地网络栈socket send buffer写满。此时,进入等待,直到网络栈重新可写,再继续发送
  6. 一个查询在发送数据的过程中,占用MySQL内部的内存最大为net_buffer_length,因此不会达到200G
  7. socket send buffer也不可能达到200G,如果socket send buffer被写满,就会暂停读取数据
-- 16384 Bytes = 16 KB
mysql> SHOW VARIABLES LIKE '%net_buffer_length%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| net_buffer_length | 16384 |
+-------------------+-------+

Sending to client

  1. MySQL是边读边发的,如果客户端接收慢,会导致MySQL服务端由于结果发不出去,事务的执行时间变长
  2. 下图为MySQL客户端不读取socket receive buffer中的内容的场景
    1. State为Sending to client,表示服务端的网络栈写满了
  3. mysql --quick,会使用mysql_use_result方法,该方法会读取一行处理一行
    1. 假设每读出一行数据后要处理的逻辑很慢,就会导致客户端要过很久才会去取下一行数据
    2. 这时也会出现State为Sending to client的情况
    3. 对于正常的线上业务,如果单个查询返回的结果不多,推荐使用mysql_store_result接口
    4. 适当地调大net_buffer_length可能是个更优的解决方案
      在这里插入图片描述

Sending data

State切换

  1. MySQL的查询语句在进入执行阶段后,首先把State设置为Sending data
  2. 然后,发送执行结果的列相关的信息(meta data)给客户端
  3. 再继续执行语句的流程,执行完成后,把State设置为空字符串
  4. 因此State为Sending data不等同于正在发送数据

样例

CREATE TABLE `t` (
    `id` int(11) NOT NULL,
    `c` int(11) NOT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO t VALUES (1,1);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 全表扫描 的相关文章

  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • 无法使用 Django 应用程序从容器连接到 MySQL docker 容器

    当我尝试从运行 Django 应用程序的 docker 容器连接到运行 MySQL 的容器时 出现以下错误 django db utils OperationalError 2003 Can t connect to MySQL serve
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • 当“修复表”查询在 mysql 中不起作用时该怎么办?

    我收到此错误 表的存储引擎不支持修复 当我尝试使用查询修复表时repair table tbl college master 表是 innodb 类型 但我不知道我收到此错误 See 手册 http dev mysql com doc re
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 显示表 FULLTEXT 索引列

    我希望运行一个查询 该查询将返回表中全文索引的列列表 该表采用 MyISAM 格式 我将使用 php 来构建查询 理想情况下 我会运行查询 它会返回信息 以便我可以构造一个以逗号分隔的列字符串 例如 名 姓 电子邮箱 这在 MySQL 中可
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb

随机推荐

  • APS高级计划排程系统的基本原理和排程步骤

    APS高级计划与排程系统作为ERP和MES之间的桥梁 是承上启下的作用 用于协调物流 开发瓶颈资源和保证交货日期 APS系统包括需求和供应计划 运输和生产计划排程等各种供应链计划模块 下面主要介绍APS中生产计划排程模块的基本原理 APS系
  • linux线程及线程间通讯

    目录 一 线程 1 线程接口相关函数 1 创建线程 2 结束线程 3 等待线程 2 线程间通信 1 同步 2 互斥 一 线程 每一个进程的地址空间是相互独立的 每一个进程都有一个叫task struct任务结构体 在进行进程切换时需要不断刷
  • java.lang.NosuchMethodError:kotlin.collections.ArraysKt.copyInto

    在maven中加入
  • 关于联想台式机bios中虚拟化设置

    关于联想台式机bios中虚拟化设置 目前电脑更多的是从BIOS中查看是否支持虚拟化技术 当CPU支持VT x虚拟化技术的前提条件下 部分电脑将自动开启VT x功能 譬如IdeaPad Y450产品就采用了此设计 而大部分机型需要通过BIOS
  • 机器学习二-kmeans-kdtree

    机器学习纯java代码 点击打开链接 KD树介绍http www pelleg org shared hp kmeans html 我们的数据集也是从5高斯分布中随机生成的8000个点 你应该看到底层的Gaussians 蓝色边界表示 根
  • java socket 发送xml_socket 发送和接收XML 并解析

    就是在 用JAVA获取XML信息 第二步 SAX 上面增加一点内容 用Socket发送和接收 客户端口 XMLC java Created on 2004 11 15 TODO To change the template for this
  • 【linux】进程和线程的几种状态及状态切换

    文章目录 一 进程的状态 1 1 进程的三种状态 1 2 三种状态转换图 1 3 三种状态之间的转换 1 4 linux下的进程进程状态 二 线程的状态 三 总结 一 进程的状态 1 1 进程的三种状态 进程状态 一个进程的生命周期可以划分
  • 关于打包成APK

    1 可以观看网站 https my oschina net Jacedy blog 350226 里面有具体的步骤 具体的需要下载的如图所示 2 将jdk安装好 然后根据网址一次安装好环境 1 系统变量里新建JAVA HOME变量 变量值为
  • Linux实时查看文件/var/log/messages以及这个文件的问题

    耐心看完说不定有你遇到的问题 1 var log messages 首先说一下这个文件的存在 在Ubuntu系统中 这个文件你访问可能提示找不到这个文件 使用tail命令访问 name name sudo tail var log mess
  • 进程(二)—— fork()创建子进程

    假设进程A在运行过程中遇到非法请求 但是进程A手里有活 要忙手上的事 所以进程A创建一个子进程a 让子进程a去处理非法请求 目录 一 子进程创建代码实现 1 fork 函数 2 使用fork 函数创建子进程 二 子进程的创建过程 1 创建子
  • unity3d收集金币

    unitysd中 对象有一个碰撞检测的方法 可以应用于收集金币 void OnTriggerEnter Collider col if col gameObject tag Player 如果碰撞的对象是玩家 money 金钱加一 Dest
  • 深度解析:印度软件产业为何如此发达

    在全球范围内 无论是发达国家 还是发展中国家 都形成了若干规模不等 各具特色的软件产业聚集地 如美国的硅谷 日本九州的硅岛 印度班加罗尔的软件园等等 这些产业聚集地已经成为全球经济格局的重要组成部分 其中 印度的软件业聚集情况颇具借鉴意义
  • 关于tomcat中startup.bat启动闪退问题

    关于tomcat中startup bat启动闪退问题 这个首先我们想到的是系统环境变量的配置问题 所以可以进行一下环境变量检测 配置系统变量 CATALINA HOME 如下图所示 如果这个配置没有问题 且仍然后出现闪退问题 配置setcl
  • python关闭浏览器窗口_Selenium3 + Python3自动化测试系列十二——窗口截图与关闭浏览器...

    窗口截图 自动化用例是由程序去执行的 因此有时候打印的错误信息并不十分明确 如果在脚本执行出错的时候能对当前窗口截图保存 那么通过图片就可以非常直观地看出出错的原因 WebDriver提供了截图函数get screenshot as fil
  • js中的变量

    js中的变量分为局部变量和全局变量 成员变量 局部变量 只有在局部中能狗被访问 全局变量 在哪里都能被访问 局部变量定义在函数体内的生命周期一般跟随函数 当函数执行后 定义该局部变量 当函数不在使用时 被系统回收机制回收 function
  • JTAG与SWD连接方式

    先上图 图中可以看出SWD所需的连接口明显小于JTAG 接下来简要介绍下连接方式 SWD 只需连接SWDIO SWCLK GND VCC 有的时候也不需要连 JTAG 必须连接VCC GND TMS TCLK TDI TDO 可选连接TRS
  • 话谈实际工作中的数据分析

    篇始 不知不觉 到新的公司任数据分析师一职已有大半年的时光 在段时光中 无可避免的犯了很多错误 亦得到了许多收获 今天 对于在职中的一些过错与收获进行总结 以期在日后的工作与成长过程中 能够更加的顺利 谈谈数据分析工作需具备能力 pytho
  • React16.8的新增特性,Hook讲解

    Hook 是 React 16 8 的新增特性 它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 1 useState 用来声明state变量 类似于class里的this state 使用方法如下 e
  • mysql+显示表ddl_MySQL_DDL_数据库和表的操作

    一 创建表 语法 CREATE TABLE IF NOT EXISTS 表名 字段名 字段类型 字段约束 字段名 字段类型 字段约束 字段名 字段类型 字段约束 案例 没有添加约束 CREATE TABLE IF NOT EXISTS ta
  • MySQL 全表扫描

    Server层 db1 t有200GB mysql h host P port u user p pwd e select from db1 t gt target file 查询数据 InnoDB的数据是保存在主键索引上 全表扫描实际上是