如何用 esProc 将数据库表转储提速查询

简介: 当数据库查询因数据量大或繁忙变慢时,可借助 esProc 将数据导出为文件进行计算,大幅提升性能。以 MySQL 的 3000 万行订单数据为例,两个典型查询分别耗时 17.69s 和 63.22s。使用 esProc 转储为二进制行存文件 (btx) 或列存文件 (ctx),结合游标过滤与并行计算,性能显著提升。例如,ctx 并行计算将原查询时间缩短至 0.566s,TopN 运算提速达 30 倍。esProc 的简洁语法和高效文件格式,特别适合历史数据的复杂分析场景。

数据量大或者数据库繁忙都会导致数据库查询变慢,这时将数据用 esProc 导出存成文件再计算可以大幅提升性能。

数据与用例
MySQL 数据库有 orders_30m 表存储着历年的订单数据,表结构如下:

75f276c66290b34febca37abd4c3f03d_1744593546237100.png

数据样例:

1    3001    2023-01-05    701    Smartphone Z    1    699.99    699.99    Credit Card    888 Eighth St, Charlotte, NC    Delivered
2    3002    2023-02-10    702    Smart Scale    1    49.99    49.99    PayPal    999 Ninth Ave, Indianapolis, IN    Delivered
3    3003    2023-03-15    703    Laptop Air    1    1099.99    1099.99    Credit Card    101 Tenth Rd, Seattle, WA    Delivered

数据量:3 千万行
c5d6c00ef48cf09b8121bb977f76966a_1744593546307100.png

两个样例查询:

  1. 按支付方式和订单状态分析 2022 年 -2023 年销售额
SELECT 
    payment_method,
    order_status,
    COUNT(*) AS order_count,
    SUM(total_amount) AS total_sales,
    AVG(total_amount) AS average_order_value,
    MAX(order_date) AS latest_order_date
FROM 
    orders
WHERE 
    order_date BETWEEN '2022-01-01' AND '2023-12-31'
    AND quantity > 1  
    AND total_amount < 1000  
GROUP BY 
    payment_method, 
    order_status;

查询时间:17.69s
65365e43b3e3967e70d9e171ee79c558_1744885856003100.png

  1. 每类产品销售最多的三笔订单
WITH ranked_orders AS (
    SELECT 
        product_name,
        order_id,
        customer_id,
        order_date,
        total_amount,
        DENSE_RANK() OVER (
            PARTITION BY product_name
            ORDER BY total_amount DESC
        ) AS amount_rank
    FROM 
        orders
)
SELECT * FROM ranked_orders
WHERE amount_rank <= 3
ORDER BY product_name, amount_rank;

查询时间:63.22s

dcc2c634e14bae7215dee9b07a28a3de_1744593545282100.png

现在用 esProc 将数据转储成文件加速查询。

安装 esProc
先前往乾学院下载免费的 esProc 标准版。

安装后,配 MySQL 数据库连接。

先把 MySQL JDBC 驱动包放到 [esProc 安装目录]\common\jdbc 目录下(其他数据库类似)。
8a440c01ac87bffa9cf95c451de97f77_1744593545442100.png

然后启动 esProc IDE,菜单栏选择 Tool-Connect to Data Source,配置 MySQL 标准 JDBC 连接。

9367b3342b8d73e4401493ef093fdb57_1744593545519100.png

确定后,测试一下连接,点击 Connect,发现刚刚配置的 colddb 数据源变成粉红色证明连接成功。

ba6853ece6d956bfaaa07823fc0c0f05_1744593545621100.png

转储为 BTX
接下来将 orders 表导出转存成二进制行存文件 btx。
image.png

生成 btx 很简单,直接导出就可以,因为数据量较大 A2 使用了游标,可以应对任意规模的数据。

按 Ctrl+F9 执行:

92d7efb16da5823bf95187cf2aeb014a_1744593545724100.png

btx 文件就生成了:
9af76afd5210332c43fac9081b35324f_1744593545854100.png

下面用 btx 跑一下上面第一个计算:按支付方式和订单状态分析 2022 年 -2023 年销售额。
image.png

A3 创建文件游标,只读取用到的列,A4 用 select 进行条件过滤,A5 进行分组汇总,代码很简单不过多解释。

运行一下看,结果没问题,时间消耗了5.319 秒,比 MySQL 快了3.3 倍。

d7a00ff01a5bec89ca7af0080a769106_1744593545906100.png

转储为 CTX
除了 btx,esProc 还提供了轻量级的列存二进制文件格式 ctx。我们来试一下,将 orders 表转成 ctx:
image.png

创建 ctx 时需要先定义结构(A3),与 order 表完全一致就可以了;A4 将数据写入 ctx。

c069640847a73039adeb115bcbccf947_1744593546052100.png

可以看出来,列式的 ctx 的压缩率要远高于行式的 btx。

再做一下上面的计算。

image.png

ctx 使用时需要先 open 再创建 cursor,剩下的代码与 btx 完全一样。

运行时间:3.061 秒,比 btx 要快。

ctx 还有一项游标过滤的优化技巧,把过滤条件附加到游标上,esProc 会先只读出用于计算条件的字段值,如果条件不成立就放弃到下一步,条件成立才再继续读出其它需要的字段并创建这条记录。

image.png

把过滤条件放到 A3 的 cursor 上,其他代码基本一样的。

运行时间变成了:2.374 秒。

这里过滤条件用到了 3 个字段,而全部读取也只有 5 个字段,所以性能只提升了 32%,如果字段数相差更多,性能差距会更明显。

并行计算
esProc 还能方便地写出并行代码,btx 和 ctx 都可以,只要配置一下并行数,跟 CPU 核数一致就可以(这里配置了 8 个)。

8288765ef224ed7c814e6c617afaacb9_1744593546135100.png

看一下并行计算 btx 的脚本:
image.png

只需要在 cursor 后加了个@m选项 ,esProc 就会自动根据配置的并行数并行计算,很方便。

运行时间:1.426 秒。

ctx 也类似:
image.png

增加 @m 选项,运行时间降到了:0.566 秒。

当然,很多数据库通常也支持并行计算,但 MySQL 这方面似乎不够好,设置了并行参数后,性能也没显著提升。

汇总一下以上测试的执行时间(单位 s):

image.png

前面还有一个计算组内 TopN 的用例,这里就不给出详细测试结果了,文件仍会快很多(单线程 63.22/2.075=30.5 倍)。这里仅给出 esProc 的代码实现,来感受其语法的简洁和完善性。

每类产品销售最多的三笔订单:

image.png

esProc 将 TopN 理解成聚合运算,实现变得非常简单。

最后总结一下,esProc 的两种文件都比数据库要快,尤其是 ctx,常规运算也能比数据库快出几倍到十几倍;而稍复杂的 TopN 运算则要快出几十倍,将数据转存成文件的确有优势。不过,文件存储有其特定的适用场景,因为要导出数据,所以更适合计算不变的历史数据,这种场景当然也有很多。如果要处理新数据,就需要用 esProc 的混合运算了,这里不再展开,可以参考乾学院材料。

相关文章
|
2月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
2月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
2月前
|
数据库
【YashanDB知识库】数据库用户所拥有的权限查询
【YashanDB知识库】数据库用户所拥有的权限查询
|
2月前
|
存储 运维 监控
百万指标,秒级查询,零宕机——时序数据库 TDengine 在 AIOps 中的硬核实战
本篇文章详细讲述了七云团队在运维平台中如何利用 TDengine 解决海量时序数据存储与查询的实际业务需求。内容涵盖了从数据库选型、方案落地到业务挑战及解决办法的完整过程,特别是分享了升级 TDengine 3.x 时的实战经验,给到有需要的小伙伴参考阅读。
81 1
|
2月前
|
缓存 NoSQL 关系型数据库
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
63 1
|
2月前
|
数据库
|
3月前
|
存储 人工智能 监控
时序数据库 TDengine 化工新签约:存储降本一半,查询提速十倍
化工行业在数字化转型过程中面临数据接入复杂、实时性要求高、系统集成难度大等诸多挑战。福州力川数码科技有限公司科技依托深厚的行业积累,精准聚焦行业痛点,并携手 TDengine 提供高效解决方案。
88 0
|
4月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
434 6
|
4月前
|
缓存 关系型数据库 MySQL
【深入了解MySQL】优化查询性能与数据库设计的深度总结
本文详细介绍了MySQL查询优化和数据库设计技巧,涵盖基础优化、高级技巧及性能监控。
1057 1
|
5月前
|
存储 缓存 网络协议
数据库执行查询请求的过程?
客户端发起TCP连接请求,服务端通过连接器验证主机信息、用户名及密码,验证通过后创建专用进程处理交互。服务端进程缓存以减少创建和销毁线程的开销。后续步骤包括缓存查询(8.0版后移除)、语法解析、查询优化及存储引擎调用,最终返回查询结果。
69 6

热门文章

最新文章