MariaDB 列存储 LAST_INSERT_ID() 替代

Posted

技术标签:

【中文标题】MariaDB 列存储 LAST_INSERT_ID() 替代【英文标题】:MariaDB Columnstore LAST_INSERT_ID() alternative 【发布时间】:2017-08-02 12:59:23 【问题描述】:

环境:

操作系统:CentOS 7.2

数据库服务器:10.1.23-MariaDB Columnstore 1.0.9-1

2个测试数据库,1个InnoDB和1个Columnstore:

CREATE TABLE `test_innodb` (
    `ctlid` bigint(20) NOT NULL AUTO_INCREMENT,
    `rfid` varchar(100) DEFAULT NULL,
    PRIMARY KEY (`ctlid`)
) ENGINE=InnoDB

CREATE TABLE `test_cs` (
    `ctlid` bigint(20) DEFAULT NULL COMMENT 'autoincrement=1',
    `rfid` varchar(100) DEFAULT NULL
) ENGINE=Columnstore

问题:

我在 InnoDB 表中运行了几次插入:

insert into test_innodb (rfid) values ('a1');
...
insert into test_innodb (rfid) values ('aX');

当我想获取最后插入的 id 时,我运行以下命令:

select last_insert_id();

无论是否有其他并发会话在该 InnoDB 表中运行插入并触发创建其他 ctlid 值,结果都会正确显示当前会话期间插入的最后一个 ctlid 值。到目前为止一切顺利..

现在,我对 Columnstore 表执行了几次插入操作:

insert into test_cs (rfid) values ('a1');
...
insert into test_cs (rfid) values ('aX');

我想实现与上述相同的行为,但不幸的是,Columnstore 忽略了这一点:

select last_insert_id();

我使用了以下替代方法:

-- this will return the next value
select nextvalue from calpontsys.syscolumn cs where cs.schema='my_test_database' and cs.tablename='test_cs' and cs.columnname='ctlid';

- this will return the last inserted id
select callastinsertid('test_cs');

但两者都显示出一个主要限制:如果其他并发会话运行插入,则上述两个查询的结果会受到这些插入生成的自动增量值的影响。基本上我可能不会得到预期的最后插入的 id,但如果其他会话并行创建自动增量值,我可能会得到更大的。

我也尝试过:

锁定表

执行插入

使用select callastinsertid('test_cs')获取最后插入id

之后解锁表

但列存储似乎不支持锁定表。

是否有可能使用 Columnstore 实现一致的最后插入 id(每个会话)?

我们的计划是将我们的一些功能从 MariaDB/mysql 切换到 Columnstore,但上面的限制非常困难。

【问题讨论】:

这似乎是一个bug 问题。它还有一个开放的 jira jira.mariadb.org/browse/MCOL-780 唯一的“解决方案”是使用类似select ctlid from test_cs order by ctlid desc limit 1 很遗憾,目前还没有解决方案。我只是在另一个论坛上得到了明确的答案:groups.google.com/forum/… 【参考方案1】:

对于高速插入,插入到单独的表中,然后定期将数据从该表复制到真实表中。通过使用这个额外的表,您可以更轻松地控制规范化以及其他可能需要 AUTO_INCREMENT 值的事情。

并确保在单个线程中进行“复制”,而不是多个线程。

这里是对许多细节的讨论。 ColumnStore 需要一些调整,但我认为它对你有用。 http://mysql.rjweb.org/doc.php/staging_table

注意使用乒乓球两个表。这允许在并行复制到 ColumnStore 的同时连续摄取。

【讨论】:

看起来这是唯一可行的解​​决方案。虽然不完美,但至少它有效。 我不需要复制 N 行,只需创建一行并插入 id。 2022 年仍然没有功能,这个 Jira 甚至被关闭了 jira.mariadb.org/browse/MCOL-780

以上是关于MariaDB 列存储 LAST_INSERT_ID() 替代的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 列存储删除不删除

当 my.cnf 中的 innodb 未注释时,MariaDB 列存储未启动

数据库崩溃后无法重新启动 mariadb 列存储

MariaDB 列存储 LAST_INSERT_ID() 替代

MariaDB 动态列(Dynamic Columns)支持JSON格式存储数据

mariadb教程[78] mariadb数据类型