博客
关于我
分布式 | Prepare Statement 协议游标可行性
阅读量:614 次
发布时间:2019-03-13

本文共 1958 字,大约阅读时间需要 6 分钟。

MySQL 的 JDBC 接口在 执行 查询 语 句 时,默认 会 将 查询 的 所有 结果 集全部 取 回 放 现 场 内 存 储 中。 当 遍 历 大 型 表 时,这种 行 为 可能 会 导 致 内 存 超载(Out of Memory, OOM)。

问题 分析

传统 的 方法:使用 LIMITOFFSET。但 这种 做法 随着 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_sizetmp_table_size(视 情况 而定), 会 利 use磁盘存储, 以备 选。 这 方式 既节省内存,同时又不被,如 HALF.

内部 临时表 详述

1. 外部 临时表

用户 可 通过 CREATE TEMPORARY TABLE 命令 工作。 外部 临时表 只 在 当前 会话 中 可见, 结束 时 自动 关闭。 同一名称 的 两个 临时表 可 共存。 当 前 会话 结束 时, 临时表 被 删除。 因此,在 会话 之间, 同一名称 的 临时表 可能 存在,但 对 典型用户来说。,mark 不可见.

2. 内部 临时表

内部 临时表 是 MySQL 自动 为 SQL 语句 创建 的 轻量级 临时表,用作性能优化。 这 Depart.nay 用户 无法 观察。 但是,您可以使用 EXPLAINSHOW 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 临时表.

  • 最后, 关键是根据项目需求 充分理解 方案, 选择 最适合 的方式, 予以 实施.

    可根据项目实体以及 性能需求, 灵活使用方案. -----------

    抱歉了,文章结束.

    转载地址:http://obraz.baihongyu.com/

    你可能感兴趣的文章
    小白怎样变成UI设计师
    查看>>
    Mac抓包工具-Charles
    查看>>
    Android中获取并设置屏幕亮度
    查看>>
    Windows抓包工具-Fiddler
    查看>>
    Glide无法加载http图片问题
    查看>>
    Swift常用语法规则(一)
    查看>>
    Swift中使用DispatchGroup分组管理异步任务
    查看>>
    21-JS中常见的函数
    查看>>
    19-认识bootstrap
    查看>>
    为什么要使用UTF-8?
    查看>>
    Android多线程与双缓冲
    查看>>
    MVVM_Template
    查看>>
    not permitted by network security policy
    查看>>
    {spring.cloud.client.ipAddress}
    查看>>
    栈上内存溢出漏洞利用之Return Address
    查看>>
    Redhat6中获取LANG值为空
    查看>>
    C/C++的宏
    查看>>
    Bugku CTF web4(Web)
    查看>>
    练习2-17 生成3的乘方表 (15 分)
    查看>>
    Bugku CTF web29(Web)
    查看>>