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)并返回结果位图中整数的数量。
函数的完整列表
所有函数的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