您现在的位置是:首页 > 文章详情

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

日期:2025-04-21点击:20


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 <= 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 (9.54 sec)

mysql> 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 <= '1998-08-03'::DATE)  (cost=713639.5, row=1189399)
                            -> 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 ~ ☕


🌻 往期精彩 ▼

-- / END / --

👉 这里可以找到我

  • • 微信公众号:@少安事务所
  • • ITPUB: @少安事务所
  • • TiDB 专栏: @ShawnYan
  • • PGFans:  @严少安
  • • 墨天轮: @严少安

👉 这里有得聊

如果对国产基础软件(操作系统、数据库、中间件)感兴趣,可以加群一起聊聊。
关注微信公众号:少安事务所,后台回复[群],即可看到入口。

如果这篇文章为你带来了灵感或启发,请帮忙『三连』吧,感谢!ღ( ´・ᴗ・` )~


本文分享自微信公众号 - 少安事务所(mysqloffice)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

原文链接:https://my.oschina.net/mysqloffice/blog/18212071
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章