database - MariaDB 列存储 LAST_INSERT_ID() 替代方案

标签 database mariadb last-insert-id columnstore

环境:

操作系统:CentOS 7.2

数据库服务器:10.1.23-MariaDB 列存储 1.0.9-1

2 个测试数据库,1 个 InnoDB 和 1 个列存储:

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();

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

现在,我在列存储表中执行多次插入:

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

我想实现与上面相同的行为,但不幸的是列存储忽略了这一点:

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');

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

我也尝试过:

  • 锁定表格

  • 执行插入

  • 使用 select callastinsertid('test_cs') 获取最后一个插入 ID

  • 随后解锁表格

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

是否有可能使用列存储实现一致的最后插入 ID(每个 session )?

我们的计划是将一些功能从 MariaDB/MySQL 切换到列存储,但上述限制相当阻碍。

最佳答案

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

并且一定要在单个线程中执行“复制”,而不是在多个线程中。

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

注意对两个表进行乒乓操作的使用。这样可以在并行复制到 ColumnStore 的同时进行连续摄取。

关于database - MariaDB 列存储 LAST_INSERT_ID() 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461572/

相关文章:

javascript - 如何使用 Sequelize 将值 'null' 插入 MariaDB?

database - 位图索引有何帮助?

php - 无法在 mysqli 中获取搜索结果

mysql - 在 > 和 < SQL 之间查找

php - 将 mysql 最后插入的 id 作为链接变量返回

mysql - PHPMYADMIN LAST_INSERT_ID 返回 0

php - 仅从表中获取不同的月份和日期

MySQL 查询获取属于某个组织的所有用户

mysql - MariaDB:如何使用 STR_TO_DATE 考虑本地日期格式?