sql - MariaDb ColumnStore 服务器中使用主键的删除/更新速度非常慢
问题描述
我们有带有 InnoDB 引擎的表(在 MariaDB 列存储服务器上),它有 500 万行和 2 列的主键。DDL:
CREATE TABLE `interest` (
`src_id` TINYINT NOT NULL,
`id` binary(36) NOT NULL,
`account_id` bigint(20) NOT NULL,
`instrument_id` int(11) NOT NULL,
`quantity` decimal(15,4) NOT NULL,
`time` datetime NOT NULL,
`interest` decimal(16,2) NOT NULL,
`auto_incr` bigint(20) NOT NULL ,
PRIMARY KEY (`src_id`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
并且这两个查询都需要 4-5 秒来执行
DELETE FROM interest WHERE `id`='52f35ddb-94d0-4744-bb3c-f3ae8100dc8e' AND `src_id`='1';
UPDATE interest SET interest = 1 WHERE `id`='52f35ddb-94d0-4744-bb3c-f3ae8100dc8e' AND `src_id`='1';
解释的结果是:
EXPLAIN EXTENDED DELETE FROM interest WHERE `id`='52f35ddb-94d0-4744-bb3c-f3ae8100dc8e' AND `src_id`='1';
看起来主键没有生效,因为它扫描了超过 50% 的行。
我从这个表(在 MariaDB 列存储服务器中)导出数据并将其导入到普通 MariaDB 服务器中的表中,没有这样的问题。两个查询都在 10 毫秒内执行。
我们正在使用最新版本的 MariaDB 列存储:1.2.5
解决方案
列存储使用稍微定制的 MDB 版本,并且存在自定义代码更改优化器设置的地方,但这仅适用于具有 CS 表的查询。JFYI Enterprise 10.4 和 community 10.5 将 Columnstore 作为非自定义 MDB 版本的普通引擎。
推荐阅读
- sql - MSSQL:将多行中的数据分组为 1 行
- javascript - 如何检索此字符串中定义的文件名?文件名在我的字符串的 _ 字符之后和 * 字符之前
- twitter-bootstrap - 为什么当我添加引导链接时我的 jQuery UI 幻灯片消失了
- .net-core - EF Core fluent API 中的多对多关系
- azure-devops - 如何在 Azure DevOps 构建中运行单个测试
- math - 计算所有可能组合的数量
- c# - 如何使用C#在firefox浏览器的新窗口中启动一个url
- javascript - Node Express app.js 为 GET 请求提供 404 错误
- laravel - Laravel 8 JetStream 引导程序 4
- excel - 如何在没有“内存不足”异常的情况下将大型 DataGridView 导出到 Excel?