MariaDB 11.4 中的变化和改进

MariaDB 11.4 是最新的长期支持版本(LTS)。第一个可用版本是 11.4.2,于 2024 年 5 月 29 日发布,该分支将一直支持到 2029 年 5 月 29 日。上一个 LTS 分支是 10.11,它将支持到 2028 年 2 月 16 日。

11.4 分支包括近期短期支持版本引入的增强功能:11.0、11.1、11.2、11.3,以及之前未发布的新增强功能。

以下罗列出关键新特性

一、在线DDL变更

在早期的MariaDB版本中,当一个会话正在执行ALTER TABLE MODIFY等DDL语句修改表结构时,其他会话的DML操作如UPDATE、INSERT等将被阻塞,需要等待DDL语句执行完成后才能继续。但是,在现代版本的MariaDB中,这种情况已得到改善。 举个例子:

会话一执行,alter table sbtest1 modify pad varchar(200);

会话二执行,update sbtest1 set pad='nba' where id=10000000;

在之前的版本,会话二会被阻塞。而在新版本里,会话二的UPDATE操作不会被阻塞,可以同步执行,不必等待会话一的DDL语句完成。这个改进大大提高了MariaDB的并发能力,避免了不必要的等待,提升了数据库的整体性能。

二、InnoDB 系统表空间会在启动时通过回收未使用的空间进行缩减

InnoDB 的一个历史问题是,即使删除了系统表空间数据,磁盘空间也不会被回收。因此,如果你有一个长达数小时的疯狂事务,你可能会看到你的 ibdata* 文件显著增长,而你却永远无法缩小它们。幸运的是,现在未使用的空间会在 MariaDB 启动时被释放。

三、单表UPDATE或DELETE语句,支持半连接查询优化

子查询一直以来以性能差而著称,解决方案是用join关联查询代替子查询。在之前的版本,半连接优化仅是针对select操作进行的,可以在不改变原有SQL的情况下,通过内部的优化器,把子查询改写为join关联查询。至于update或delete操作,它们的性能仍旧很差。而在最新的版本里,单表UPDATE或DELETE语句,支持半连接查询优化。

例:explain update t1 set name='aa' where id in (select id from t2 );

四、使用 DATE 或 YEAR 函数与常数进行比较的查询现在可以使用索引

例:select create_time from t_doc where YEAR(create_time)=2015;

    select create_time from t_doc where date(create_time)='2015-01-01';

以上两个SQL,可以使用上create_time索引

五、限制二进制日志文件使用的磁盘空间

担心MariaDB binlog文件增长速度过快而撑爆磁盘空间?那么需要了解一下max_binlog_total_size参数(限制二进制日志文件使用的磁盘空间),该变量对所有二进制日志的总大小(以字节为单位)设置了上限。当达到限制时,最旧的二进制日志将被清除,直到总大小低于限制或仅保留活动日志。默认值0禁用该功能。日志空间没有限制。二进制日志会无限累积,直到磁盘空间已满。(该实现基于 Percona 的补丁)

六、FULL_NODUP是binlog_row_image系统变量的新值

它的工作原理与 FULL 类似,即所有列都包含在事件中,但占用的空间更少,IO 更少。因为省略了未被 UPDATE 语句更改的列值,但是开源闪回工具,如reverse_sql不支持它。(这是阿里巴巴的贡献)

七、ALTER TABLE IMPORT 现在更容易使用了。

在移动表空间时,不再需要运行 CREATE TABLE 和 ALTER TABLE DISCARD TABLESPACE 语句。例:

FLUSH TABLES t1 FOR EXPORT;

--copy_file $MYSQLD_DATADIR/test/t1.cfg $MYSQLD_DATADIR/test/t2.cfg

--copy_file $MYSQLD_DATADIR/test/t1.frm $MYSQLD_DATADIR/test/t2.frm

--copy_file $MYSQLD_DATADIR/test/t1.ibd $MYSQLD_DATADIR/test/t2.ibd

UNLOCK TABLES;

ALTER TABLE t2 IMPORT TABLESPACE;

以前,必须执行 CREATE TABLE 和 ALTER TABLE...DISCARD TABLESPACE,而且不能重复使用现有 .frm 文件中的准确表定义。现在直接ALTER ... IMPORT即可。

八、mariadb-dump 现在支持多线程并行备份,类似于 mydumper

使用方法

代码语言:shell
复制
Shell> mariadb-dump  -S /tmp/mysql_mariadb.sock  -uroot  -p123456 
--compact --skip-ssl --single-transaction --master-data=2 
--routines --triggers --events test -T /data/bak/ -j 12 
--log-error=dump.txt > metedata.txt

注:导出的数据格式为CSV,仅支持本地、单库并行执行。

-T参数,指定存放备份数据目录

-j参数,指定并发线程数,这里为12