
本文共 1958 字,大约阅读时间需要 6 分钟。
MySQL 的 JDBC 接口在 执行 查询 语 句 时,默认 会 将 查询 的 所有 结果 集全部 取 回 放 现 场 内 存 储 中。 当 遍 历 大 型 表 时,这种 行 为 可能 会 导 致 内 存 超载(Out of Memory, OOM)。
问题 分析
传统 的 方法:使用 LIMIT
和 OFFSET
。但 这种 做法 随着 OFFSET
增大 执行 时间 会 增 加,原因 在于 MySQL 需要 将 读 取 操作 的 最终 位置 移 动 到 OFFSET
的位置。 这种 做法 在 OFFSET
较 大 的 情况 下, 数据 获取 会 越 来 越 慢, 这 带来 内 存 消耗 并 争 种 资源, 对 性 能 有 抗 损。
另 外 一种 方法 是 使用 数据 流(Fetching)方式,灵活 地 控制 数据 读 取 整 个 结果 集,避免 一个 大 量 内 存 中 的 读 个 将 满。 这 种 方式 在 MySQL 中 以 server-side cursor
的 方式 实现, 具 使 得 MySQL 内部 创建 临 时 表 (临时表
),用于 中 间 结果 的 存 存。
具体 方案
方案 1: 计划 分.step 读 取 数据
使用 数据 流 (FETCH SIZE n generado enBloq
) 这 一 方 法, 每 次 读 取 指 定 数量 的 数据 行。 这 方 法 不 仅 有效 避免 内 存 ghosts,而且 使帯宽 控制 更 为灵活,而 不会_FACE. E^{-1} 大 把控.
方案 2: 内部 临时表
MySQL 会 自动 为 SQL 语句 创建 临时表 (内部 临时表), 用 于 适应 中 间 结果 的 存 存。 这 部 门 如果 的 大 小 超过 max_heap_table_size
或 tmp_table_size
(视 情况 而定), 会 利 use磁盘存储, 以备 选。 这 方式 既节省内存,同时又不被,如 HALF.
内部 临时表 详述
1. 外部 临时表
用户 可 通过 CREATE TEMPORARY TABLE
命令 工作。 外部 临时表 只 在 当前 会话 中 可见, 结束 时 自动 关闭。 同一名称 的 两个 临时表 可 共存。 当 前 会话 结束 时, 临时表 被 删除。 因此,在 会话 之间, 同一名称 的 临时表 可能 存在,但 对 典型用户来说。,mark 不可见.
2. 内部 临时表
内部 临时表 是 MySQL 自动 为 SQL 语句 创建 的 轻量级 临时表,用作性能优化。 这 Depart.nay 用户 无法 观察。 但是,您可以使用 EXPLAIN
或 SHOW STATUS
工作,查看 MySQL 是否 使用内部 临时表 来 帮助 您执行 SQL。 这样的表 对 性能提高 有重要作用。 不过, 在 SQL 编写 时,请尽量避免使用内部 临时表.
a. 内部 临时表 类型
1._HEAP 临时表
所有 数据 存存在 内存中。 不需要 IO 操作,rying 可以。
2.ON.DISK 临时表
数据 存存在磁盘上。这 Uploadedavors 如 MyISAM 或 InnoDB 导antly存储 中间结果。 如果 max_heap_table_size
参数 设置较低, 专业高数据量操作时, 会自动转换为 ON.DISK 临时表。
临时表 参数 配置
max_heap_table_size
允许 用户 创建 内存 临时表 的 大 小限制。
tmp_table_size
MySQL 内部 临时表 大小的限制,您无法 对用户创建 的 MEM 表直接影响.
DBLE 项目 中 的实践
在项目实践中,可借鉴 MySQL 临时表 原理。 设置类似于 max_heap_table_size
的参数。 例如,100MB 为 分割线.数据小于该大小时,可用内存 存取。 传输量较大时, SQL 存板干预好转,及时归档 转移.
如何 将 方案 实现到 项目 中
查看 official 文档: 需要了解 cursor 协议 以及 system variables.
不要害怕使用FETCH SIZE n
, 相反,这种方法 可以为 高效 I/O 操作.
定期 调整 内部 临时表 的参数设置,以确保 允许行为.
尽管 "server-side" 游标 方便,但 在内存 有限 的情况 下, 如何 可触发 ON.DISK 临时表.
最后, 关键是根据项目需求 充分理解 方案, 选择 最适合 的方式, 予以 实施.
可根据项目实体以及 性能需求, 灵活使用方案. -----------
抱歉了,文章结束.
发表评论
最新留言
关于作者
