GreatSQL社区

搜索

ShawnYan

GreatSQL 新版发布:MySQL 牵手“鸭子”

ShawnYan 已有 20 次阅读2025-4-21 14:17 |个人分类:少安事务所|系统分类:运维实战

GreatSQL 最新版本新增高性能并行查询引擎 Turbo,它通过内嵌 DuckDB,使 GreatSQL 具备多线程并发的向量化查询功能,从而对加速 SQL 查询实现指数级提升。本文将演示如何在 Anolis OS 8.10 操作系统一键安装 GreatSQL 8.0.32-27,并对 Turbo 引擎做简单测试。

Anolis OS 8.10

龙蜥操作系统 Anolis OS 8 是 OpenAnolis 龙蜥社区发行的开源 Linux
发行版,支持多计算架构,提供稳定、高性能、安全、可靠的操作系统支持。近日,Anolis OS 8.10 发布,是 Anolis OS 8
发布的第六个小版本。Anolis OS 8.10 ANCK 镜像默认内核变更为 5.10.134-18 版本。

升级到 Anolis OS 8.10 后,查看系统信息。

接着,安装 EPAO 软件包源,该源提供社区孵化类软件,比如 GreatSQL。

dnf install -y anolis-epao-release

近日,开源数据库 GreatSQL 正式加入龙蜥社区,龙蜥社区用户可以通过系统原生命令一键安装 GreatSQL,下面进行实操演示。

GreatSQL 8.0.32-27

GreatSQL 成立于 2021 年,由万里数据库发起,是开放原子开源基金会旗下捐赠项目,Gitee MVP 项目,拥有信通院可信开源社区+可信开源项目双认证。

2025年3月10日,GreatSQL 8.0.32-27 发版。截至今天,已正式同步更新到 openAnolis 和 openEuler
两大生态,同时,完成了统信 UOS、openKylin 适配测试,即将加入上游 Yum/Apt 仓库源,希望为社区用户带来更好的使用体验。

GreatSQL 8.0.32-27 更新的内容包括:新增高性能并行查询引擎 Turbo,升级 Rapid 引擎内核版本,优化 MGR
大事务压缩传输机制,完善 greatdb_ha plugin,InnoDB Page 支持 Zstd 压缩,完善 Oracle
兼容特性,完善安全性等,并修复了几个可能导致 crash 或丢数据的 bug。

GreatSQL 在 Anolis OS 8 或 23 支持一键安装。

[root@anolis8 ~]# dnf install -y greatsql-server
Dependencies resolved.
====================================================================
 Package                 Arch   Version             Repo       Size
====================================================================
Installing:
 greatsql-server         x86_64 8.0.32-27.2.an8     EPAO      464 M
Installing dependencies:
 greatsql-client         x86_64 8.0.32-27.2.an8     EPAO       81 M
 greatsql-icu-data-files x86_64 8.0.32-27.2.an8     EPAO      2.0 M
 greatsql-shared         x86_64 8.0.32-27.2.an8     EPAO      6.1 M
 perl-Time-HiRes         x86_64 4:1.9758-2.0.1.an8  AppStream  41 k

Transaction Summary
====================================================================
Install  5 Packages

...
Installed:
  greatsql-client-8.0.32-27.2.an8.x86_64
  greatsql-icu-data-files-8.0.32-27.2.an8.x86_64
  greatsql-server-8.0.32-27.2.an8.x86_64
  greatsql-shared-8.0.32-27.2.an8.x86_64
  perl-Time-HiRes-4:1.9758-2.0.1.an8.x86_64

Complete!
[root@anolis8 ~]#

启动 GreatSQL 服务,并检查服务状态。

[root@anolis8 ~]# systemctl start mysqld
[root@anolis8 ~]# systemctl status mysqld
● mysqld.service - MySQL Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled)
   Active: active (running) since Wed 2025-04-16 01:13:16 CST; 18s ago
     Docs: man:mysqld(8)
           http://dev.mysql.com/doc/refman/en/using-systemd.html
  Process: 5924 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
 Main PID: 6026 (mysqld)
   Status: "Server is operational"
    Tasks: 51 (limit: 49029)
   Memory: 595.0M
   CGroup: /system.slice/mysqld.service
           └─6026 /usr/sbin/mysqld

Apr 16 01:13:02 anolis8.shawnyan.cn systemd[1]: Starting MySQL Server...
Apr 16 01:13:16 anolis8.shawnyan.cn systemd[1]: Started MySQL Server.
[root@anolis8 ~]#

初次启动 GreatSQL 后,会随机生成 root 用户的密码,通过搜索日志文件获取。

[root@anolis8 ~]# grep 'temporary password' /var/log/mysqld.log
2025-04-15T17:13:13.651497Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: dU7qT04%hQ>x

登入 GreatSQL 后,需立即修改 root 密码,否则无法执行其他操作。

[root@anolis8 ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.32-27

...
mysql> alter user root@localhost identified by 'GreatSQL@123';
Query OK, 0 rows affected (0.01 sec)

mysql> \q
Bye

使用新密码再次登录 GreatSQL 服务器,可正常使用。

[root@anolis8 ~]# mysql -uroot -p'GreatSQL@123'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.32-27 GreatSQL (GPL), Release 27, Revision aa66a385910

Copyright (c) 2021-2025 GreatDB Software Co., Ltd
Copyright (c) 2009-2025 Percona LLC and/or its affiliates
Copyright (c) 2000, 2025, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s
--------------
mysql  Ver 8.0.32-27 for Linux on x86_64 (GreatSQL (GPL), Release 27, Revision aa66a385910)

Connection id:          10
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         8.0.32-27 GreatSQL (GPL), Release 27, Revision aa66a385910
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:            /var/lib/mysql/mysql.sock
Binary data as:         Hexadecimal
Uptime:                 3 min 8 sec

Threads: 2  Questions: 10  Slow queries: 1  Opens: 134  Flush tables: 3  Open tables: 50  Queries per second avg: 0.053
--------------

mysql> show schemas;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

GreatSQL 的 Turbo 引擎:插上 OLAP 的翅膀

GreatSQL 8.0.32-27 的一大亮点是新增了高性能并行查询引擎 Turbo,通过内嵌 DuckDB,赋予了 GreatSQL
多线程并发的向量化查询能力,从而实现了 SQL 查询速度的指数级提升。与之前的 Rapid 引擎不同,Turbo
引擎无需预先加载数据,而是在查询过程中由 GreatSQL 并行抽取数据供其使用,灵活性和效率显著提高。

启用 Turbo

Turbo 引擎以插件形式存在,用户可以根据需要在线动态安装或卸载。由于 Turbo 引擎的源代码未公开,所以龙蜥系统上的安装包并没有包含相关类包,可从 CentOS 的安装包中获取插件,并手动上传服务器。

/usr/lib64/mysql/plugin/turbo.so
/usr/lib64/mysql/private/libduckdb.so

在线安装 Turbo 引擎。

mysql> INSTALL PLUGIN turbo SONAME 'turbo.so';
Query OK, 0 rows affected (0.03 sec)

安装完成后,查看 Turbo 插件信息。

mysql> select * from information_schema.PLUGINS where PLUGIN_NAME = 'turbo'\G
*************************** 1. row ***************************
           PLUGIN_NAME: turbo
        PLUGIN_VERSION: 0.1
         PLUGIN_STATUS: ACTIVE
           PLUGIN_TYPE: QUERY PLAN
   PLUGIN_TYPE_VERSION: 1.0
        PLUGIN_LIBRARY: turbo.so
PLUGIN_LIBRARY_VERSION: 1.11
         PLUGIN_AUTHOR: GreatOpenSource
    PLUGIN_DESCRIPTION: turbo query plan
        PLUGIN_LICENSE: GPL
           LOAD_OPTION: ON
1 row in set (0.00 sec)

查看相关参数变量。

mysql> show variables like 'turbo%';
+---------------------------------+--------------------+
| Variable_name                   | Value              |
+---------------------------------+--------------------+
| turbo_compat_func               | ON                 |
| turbo_condition_pushdown        | OFF                |
| turbo_cost_threshold            | 100000.000000      |
| turbo_enable                    | OFF                |
| turbo_enable_ps_and_sp          | ON                 |
| turbo_enable_rollback           | OFF                |
| turbo_enable_warning            | OFF                |
| turbo_exec                      |                    |
| turbo_index_range               | OFF                |
| turbo_max_temp_directory_size   | 1073741824         |
| turbo_memory_limit              | 268435456          |
| turbo_parallel_read_buffer_size | 2097152            |
| turbo_release_retries           | 600                |
| turbo_retry_pause               | 1000               |
| turbo_skip_charset_check        | OFF                |
| turbo_temp_directory            | duckdb_dp.data.tmp |
| turbo_worker_threads            | 4                  |
+---------------------------------+--------------------+
17 rows in set (0.01 sec)

查看相关状态变量。

mysql> show status like 'turbo%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| turbo_memory_used | 0     |
| turbo_release     | OFF   |
| turbo_runtime     | 0     |
| turbo_statements  | 0     |
+-------------------+-------+
4 rows in set (0.15 sec)

默认情况下,安装 Turbo 插件后并不会启用,需要调整 turbo_enable 参数。为了便于测试,我们可以将参数 turbo_cost_threshold 设置为 0,意味着无论执行查询的代价是多少都将使用 Turbo。需要注意的是,部分 Turbo 参数的作用域只限于会话级,具体参见官方文档。

SET GLOBAL turbo_enable=ON;
SET GLOBAL turbo_enable_warning=ON;

或者,在 SQL 语句中嵌入 Hint 调用 Turbo,查询计划显示中带有 Turbo scan 关键字,说明语句使用了 Turbo 引擎。

mysql> EXPLAIN FORMAT=TREE SELECT /*+ SET_VAR(turbo_enable=ON) SET_VAR(turbo_cost_threshold=0) */ * FROM mydb.t1\G
*************************** 1. row ***************************
EXPLAIN: -> Turbo scan
    -> Table scan on t1, column(id)  (cost=0.1, row=1)


1 row in set (0.00 sec)

目前,Turbo 仅支持常规 SELECT 查询和 INSERT SELECT。Turbo 作为并行执行引擎,其并不做数据存储,而是将数据加载到内存来提高并行计算性能。因此,需要按需调整内存相关参数,以及增加相关指标监控。

测试 Turbo

为了验证 Turbo 引擎的性能,我们进行了多项测试。例如,对新版 GreatSQL 进行 TPC-H
测试,这是一个广泛用于评估数据库性能的标准测试集。通过对比 Turbo 引擎开启与关闭时的查询执行时间,我们可以直观地感受到 Turbo
引擎带来的性能提升。

生成测试数据。

[root@anolis8 workloads]# tiup bench tpch prepare -U mytest -p Mytest -H 192.168.43.88 -P 3306 -D mytest
Starting component bench: /root/.tiup/components/bench/v1.12.0/tiup-bench tpch prepare -U mytest -p ****** -H 192.168.43.88 -P 3306 -D mytest
creating nation
creating region
creating part
creating supplier
creating partsupp
creating customer
creating orders
creating lineitem
generating nation table
generate nation table done
generating region table
generate region table done
generating customers table
generate customers table done
generating suppliers table
generate suppliers table done
generating part/partsupplier tables
generate part/partsupplier tables done
generating orders/lineitem tables
generate orders/lineitem tables done
Finished

运行 Q1 测试,比对结果如下。

未开启 Turbo 时,Q1 运行 9.54 sec,使用 Turbo 后,Q1 运行 1.49 sec,查询效率提升显著。

mysql> SELECT /*+ SET_VAR(turbo_enable=OFF) */ l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)  ) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax) ) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate  SELECT /*+ SET_VAR(turbo_enable=ON) SET_VAR(turbo_cost_threshold=0) */ l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)  ) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax) ) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus;
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| l_returnflag | l_linestatus | sum_qty     | sum_base_price  | sum_disc_price    | sum_charge          | avg_qty   | avg_price    | avg_disc | count_order |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
| A            | F            | 37734107.00 |  56586554400.73 |  53758257134.8700 |  55909065222.827692 | 25.522006 | 38273.129735 | 0.049985 |     1478493 |
| N            | F            |   991417.00 |   1487504710.38 |   1413082168.0541 |   1469649223.194375 | 25.516472 | 38284.467761 | 0.050093 |       38854 |
| N            | O            | 72798693.00 | 109186056038.16 | 103727910277.8472 | 107880806426.511496 | 25.501757 | 38248.437828 | 0.050000 |     2854654 |
| R            | F            | 37719753.00 |  56568041380.90 |  53741292684.6040 |  55889619119.831932 | 25.505794 | 38250.854626 | 0.050009 |     1478870 |
+--------------+--------------+-------------+-----------------+-------------------+---------------------+-----------+--------------+----------+-------------+
4 rows in set (1.49 sec)

分别查看两种条件下的执行计划。

mysql> EXPLAIN format=tree SELECT /*+ SET_VAR(turbo_enable=OFF) */ l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)  ) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax) ) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus\G
*************************** 1. row ***************************
EXPLAIN: -> Sort: lineitem.L_RETURNFLAG, lineitem.L_LINESTATUS
    -> Table scan on <temporary>
        -> Aggregate using temporary table
            -> Filter: (lineitem.L_SHIPDATE <= <cache>((DATE'1998-12-01' - interval '120' day)))  (cost=608923.60 rows=1982134)
                -> Table scan on lineitem  (cost=608923.60 rows=5946996)

1 row in set (0.00 sec)

mysql> EXPLAIN format=tree SELECT /*+ SET_VAR(turbo_enable=ON) SET_VAR(turbo_cost_threshold=0) */ l_returnflag, l_linestatus, SUM(l_quantity) AS sum_qty, SUM(l_extendedprice) AS sum_base_price, SUM(l_extendedprice * (1 - l_discount)  ) AS sum_disc_price, SUM(l_extendedprice * (1 - l_discount) * (1 + l_tax) ) AS sum_charge, AVG(l_quantity) AS avg_qty, AVG(l_extendedprice) AS avg_price, AVG(l_discount) AS avg_disc, COUNT(*) AS count_order FROM lineitem WHERE l_shipdate <= DATE '1998-12-01' - INTERVAL '120' DAY GROUP BY l_returnflag, l_linestatus ORDER BY l_returnflag, l_linestatus\G
*************************** 1. row ***************************
EXPLAIN: -> Turbo scan
    -> Sort: strip_accents(lower(lineitem.l_returnflag)) ASC, strip_accents(lower(lineitem.l_linestatus)) ASC  (cost=1129929.0, row=594699)
        -> projection: (L_RETURNFLAG, L_LINESTATUS, sum_qty, sum_base_price, sum_disc_price, sum_charge, avg_qty, avg_price, avg_disc, count_order)  (cost=1070459.1, row=594699)
            -> Group aggregate: (#0, #1), aggregates(first(#2), first(#3), sum(#4), sum(#5), sum(#6), sum(#7), avg(#8), avg(#9), avg(#10), count_star())  (cost=1010989.2, row=594699)
                -> projection: (strip_accents(lower(lineitem.l_returnflag)), strip_accents(lower(lineitem.l_linestatus)), lineitem.l_returnflag, lineitem.l_linestatus, lineitem.l_quantity, lineitem.l_extendedprice, #4, (#4 * (1.00 + CAST(L_TAX AS DECIMAL(22,2)))), lineitem.l_quantity, lineitem.l_extendedprice, lineitem.l_discount)  (cost=951519.3, row=1189399)
                    -> projection: (L_RETURNFLAG, L_LINESTATUS, L_QUANTITY, L_EXTENDEDPRICE, (CAST(L_EXTENDEDPRICE AS DECIMAL(37,2)) * (1.00 - CAST(L_DISCOUNT AS DECIMAL(22,2)))), L_TAX, L_DISCOUNT)  (cost=832579.4, row=1189399)
                        -> Filter: (lineitem.l_shipdate  Table scan on lineitem, column(L_SHIPDATE,L_RETURNFLAG,L_LINESTATUS,L_QUANTITY,L_EXTENDEDPRICE,L_DISCOUNT,L_TAX)  (cost=594699.6, row=5946996)


1 row in set (0.00 sec)

经过 TPC-H 测试,可以说明 Turbo 引擎能够有效地处理复杂的查询任务,为用户提供了一种新的高效数据查询方案。

不过,并不是所有场景 Turbo 都能提升性能,也有不适用的场景。比如,准备 YCSB 数据集,生成 100000 条数据。

[root@anolis8 workloads]# tiup bench ycsb load mysql -P greatsql -P workloadc
...
Run finished, takes 2m21.286146226s
INSERT - Takes(s): 141.3, Count: 100000, OPS: 707.8, Avg(us): 1384, Min(us): 415, Max(us): 1653759, 99th(us): 3561, 99.9th(us): 51327, 99.99th(us): 167039

开启 Turbo 后,自关联查询出现性能衰退现象。

mysql> select /*+ SET_VAR(turbo_enable=ON) */ count(*) from usertable t1 join usertable t2 on t1.YCSB_KEY=t2.YCSB_KEY\G
*************************** 1. row ***************************
count(*): 100000
1 row in set (1.60 sec)

mysql> select /*+ SET_VAR(turbo_enable=OFF) */ count(*) from usertable t1 join usertable t2 on t1.YCSB_KEY=t2.YCSB_KEY\G
*************************** 1. row ***************************
count(*): 100000
1 row in set (0.37 sec)

因此,不建议全局启用 Turbo,而是经过测试后按需启用。这是 Turbo 引入 GreatSQL 后的第一个版本,肯定会有不完善之处,如遇问题欢迎评论吐槽。

总结

GreatSQL 是 MySQL 国产化替代的优质选项,Turbo 引擎的加入,为 GreatSQL 注入了新的活力。期待
GreatSQL 与龙蜥社区进一步加强合作,成立 GreatSQL SIG,帮助更多企业完成操作系统和数据库国产化目标。最后,期待
GreatSQL 8.4 大版本迭代。

参考资料


Have a nice day ~




评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2025-4-22 04:22 , Processed in 0.016424 second(s), 10 queries , Redis On.
返回顶部