#bitmap #maria-db #user-defined #roaring #function #sql #udf

mysql_roaring

作为 MySQL/MariaDB 用户自定义函数的 Roaring 位图

1 个不稳定版本

0.1.0 2023年4月9日

#1095 in 数据库接口

自定义许可证

29KB
327

作为 MySQL/MariaDB 用户自定义函数的 Roaring 位图

此开发已完成,但仅部分测试。请自行承担使用风险。

存储

  • 您可以使用 LONGBLOB 数据类型将位图存储在 MySQL/MariaDB 列中。
  • 请记住,如果您正在使用数据库复制,您可能需要排除包含位图的表,或者切换到基于语句的复制。否则,您的二进制日志大小将显著增加,数据库性能将略有下降。

UDF 函数

前缀

  • roaring32 - 用于 INT(可能是无符号的)
  • roaring64 - 用于 BIGINT(可能是无符号的)
  • nullsafe - 如果至少有一个参数为 NULL,SQL 函数将返回 NULL。使用 'nullsafe' 前缀时,函数将返回空的结果,而不是 NULL。
    • 空位图 BLOB
    • 0 对于整数
    • '[]' 对于 json

函数

  • roaring[32|64]_[nullsafe_]create(value0 INT,[value1 INT[, ...]]) -> BLOB - 从多个整数参数创建位图。
  • roaring[32|64]_[nullsafe_][remove|insert](map BLOB, value0 INT[,value1 INT[, ...]]) -> BLOB - 向位图添加或删除多个整数。
  • roaring[32|64]_[nullsafe_]contains (map BLOB, value INT) -> BOOL - 检查整数是否在位图中。
  • roaring[32|64]_[nullsafe_]count (map BLOB) -> INT - 位图中有多少个整数。
  • roaring[32|64]_[nullsafe_]json (map BLOB) -> TEXT - 将位图中的所有整数作为JSON数组获取。
  • roaring[32|64]_[nullsafe_][and|or|xor] ([map0 BLOB[, map1 BLOB[, ...]]]) -> BLOB - 对多个位图参数执行位图操作(and, or, xor),并返回结果位图。
  • roaring[32|64]_[nullsafe_][and|or|xor]_count ([map0 BLOB[, map1 BLOB[, ...]]]) -> BLOB - 对多个位图参数执行位图操作(and, or, xor),并返回结果位图中的整数数量。
  • roaring[32|64]_[nullsafe_]group_create (value INT) -> BLOB - 聚合。从整数创建位图作为组。
  • roaring[32|64]_[nullsafe_]group_[and|or|xor] (map BLOB) -> BLOB - 聚合。对组中的位图执行一个位图操作(and、or、xor)并返回结果位图。
  • roaring[32|64]_[nullsafe_]group_[and|or|xor]_count (map BLOB) -> BLOB - 聚合。对组中的位图执行一个位图操作(and、or、xor)并返回结果位图中整数的数量。

函数的完整列表

libmysql_roaring.md

所有函数的SQL查询

libmysql_roaring.sql

构建和安装

独立的MySQL/MariaDB

  • 获取Rust编程语言工具 https://www.rust-lang.net.cn/tools/install
  • 获取此Git仓库 git clone --depth=1 https://github.com/tarasbogach/mysql_roaring.git
  • 进入项目文件夹 cd mysql_roaring
  • 构建此项目 cargo build --release
  • 现在你应该有了编译的共享库 ./target/release/libmysql_roaring.so
  • 找到您的MySQL/MariaDB插件文件夹 echo "SHOW VARIABLES LIKE 'plugin_dir';" | mysql,并将共享库复制到其中 sudo cp ./target/release/libmysql_roaring.so /usr/lib/mysql/plugin/
  • libmysql_roaring.sql 运行查询 cat libmysql_roaring.sql | mysql

Docker

您需要在Dockerfile中添加 build 阶段。并将 .so.sql 文件从其中复制到您的MySQL/MariaDB镜像中。

FROM rust:latest AS build

ENV CARGO_REGISTRIES_CRATES_IO_PROTOCOL=sparse

WORKDIR /build

COPY ./mysql_roaring /build

RUN --mount=type=cache,target=/usr/local/cargo/registry \
    --mount=type=cache,target=/build/target \
    cargo build --release \
    && mkdir /output \
    && cp target/release/libmysql_roaring.so /output \
    && cp libmysql_roaring.sql /output

FROM mariadb

COPY --from=build /output/libmysql_roaring.so /usr/lib/mysql/plugin/
COPY --from=build /output/libmysql_roaring.sql /docker-entrypoint-initdb.d/

示例

32位整数

CREATE DATABASE IF NOT EXISTS example;

CREATE TABLE IF NOT EXISTS example.bitmaps (id INT8 UNSIGNED PRIMARY KEY, map LONGBLOB);

TRUNCATE TABLE example.bitmaps;

INSERT INTO  example.bitmaps
SELECT seq % 10 as id, roaring32_group_create(CAST(RAND() * POW(2, 31) AS INTEGER)) as map
FROM mysql.seq_1_to_1000000 GROUP BY seq % 10;

SELECT roaring32_count(map) FROM example.bitmaps;

SELECT roaring32_group_or_count(map) FROM example.bitmaps;

64位整数

请注意,64位版本可能比32位版本慢得多(在某些情况下慢6.5倍)。

CREATE DATABASE IF NOT EXISTS example;

CREATE TABLE IF NOT EXISTS example.bitmaps (id INT8 UNSIGNED PRIMARY KEY, map LONGBLOB);

TRUNCATE TABLE example.bitmaps;

INSERT INTO  example.bitmaps
SELECT seq % 10 as id, roaring64_group_create(CAST(RAND() * POW(2, 63) AS INTEGER)) as map
FROM mysql.seq_1_to_1000000 GROUP BY seq % 10;

SELECT roaring64_count(map) FROM example.bitmaps;

SELECT roaring64_group_or_count(map) FROM example.bitmaps;

依赖关系

~1.7–2.4MB
~46K SLoC