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

mysql_roaring_macros

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

1 个不稳定版本

0.1.0 2023年4月9日

#13 in #maria-db


mysql_roaring 中使用

自定义许可

43KB
742

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

此开发已完成,但仅部分测试。请在自己的风险下使用。

存储

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

UDF函数

前缀

  • roaring32 - 用于INT(可能为无符号)
  • roaring64 - 用于BIGINT(可能为无符号)
  • nullsafe - SQL函数如果至少有一个参数为NULL,则返回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 - 在多个位图参数上执行位图操作(且、或、异或)并返回结果位图。
  • roaring[32|64]_[nullsafe_][and|or|xor]_count ([map0 BLOB[, map1 BLOB[, ...]]]) -> BLOB - 在多个位图参数上执行位图操作(且、或、异或)并返回结果位图中的整数数量。
  • 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://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;

依赖

~83KB