作者:鲍凤其
爱可生 dble 团队开发成员,次要负责 dble 需要开发,故障排查和社区问题解答。少说废话,放码过去。
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
背景
MySQL JDBC 在执行查问语句时,默认把查问的所有后果全副取回放在内存中,如果遍历很大的表,则可能把内存撑爆。
方法 1
查问语句中应用 limit,offset;这样咱们会发现取数据的越来越慢,起因是在设置了 offset 之后,MySQL 须要将读取地位挪动到 offset 的地位,随着 offset 增大,取数据也越来越慢;
方法 2
用数据流的形式取数据,能够指定 fetch size,这样每次获取指定数量的数据行,从而防止 OOM。此种形式的应用形式和原理能够参见文章:prepare statement 协定
第 2 种形式理论是 MySQL 中的 server-side 游标,server-side 游标是应用 MySQL 外部长期表来实现的。初始的时候,外部长期表是个内存表,当这个表的大小超过 max_heap_table_size and tmp_table_size 两个零碎变量的最小值的时候(两者的最小值),会被转换成 MyISAM 表,即落盘存储。
外部长期表的应用限度同样实用于游标的外部长期表。
MySQL 中的两种长期表
内部长期表
用户通过 CREATE TEMPORARY TABLE 语句显式创立的长期表,这样的长期表称为内部长期表。
内部长期表生命周期:创立后,只在以后会话中可见,以后会话完结的时候,该长期表也会被主动敞开。
因而,两个会话能够存在同名的长期表,但若有同名的非长期表时,直到长期表被删除,这张表对用户是不可见的。
外部长期表
外部长期表是一种非凡轻量级的长期表,用来进行性能优化。这种长期表会被 MySQL 主动创立并用来存储某些操作的两头后果。这些操作可能包含在优化阶段或者执行阶段。
这种外部表对用户来说是不可见的,然而通过 EXPLAIN 或者 SHOW STATUS 能够查看 MySQL 是否应用了外部长期表用来帮忙实现某个操作。外部长期表在 SQL 语句的优化过程中扮演着十分重要的角色,MySQL 中的很多操作都要依赖于外部长期表来进行优化。然而应用外部长期表须要创立表以及两头数据的存取代价,所以用户在写 SQL 语句的时候应该尽量的去防止应用长期表。
外部长期表有两种类型
1、HEAP 长期表
这种长期表的所有数据都会存在内存中,对于这种表的操作不须要 IO 操作。
2、OnDisk 长期表
顾名思义,这种长期表会将数据存储在磁盘上。OnDisk 长期表用来解决两头后果比拟大的操作。如果 HEAP 长期表存储的数据大于 MAX_HEAP_TABLE_SIZE(参数参考链接),HEAP 长期表会被主动转换成 OnDisk 长期表。OnDisk 长期表在 5.7 中能够通过 INTERNAL_TMP_DISK_STORAGE_ENGINE 零碎变量抉择应用 MyISAM 引擎或者 InnoDB 引擎。
长期表的参数
max_heap_table_size
用户创立 Memory 表容许的最大 size,这个值和 tmp_table_size 一起应用,限度外部长期表在内存中的大小。
tmp_table_size
外部长期内存表大小的最大值,不适用于用户本人创立的 Memory 表
MySQL 中没有找到限度长期表磁盘文件大小的参数。
DBLE 中的设计
DBLE 中可参考 MySQL 的长期表的实现,指定一个相似 MAX_HEAP_TABLE_SIZE 的参数。小于这个数值,寄存在内存中直接存取,一旦达到这个阈值,同样落盘解决。
官网文档:
https://dev.mysql.com/doc/ref…
https://dev.mysql.com/doc/ref…
https://dev.mysql.com/doc/ref…