gpt4 book ai didi

mysql - 如何从 Mysql select ID 查询中获取 bitset BLOB?

转载 作者:行者123 更新时间:2023-11-29 05:33:32 24 4
gpt4 key购买 nike

如果以下事情成为可能,那就太好了:

假设我有一个“文档”mysql 表,其中有一个文档“id”和一些其他列:

CREATE TABLE document(id INT AUTO_INCREMENT NOT NULL, ....);

可以有很多文档,但假设现在我只有 200 万。

我想在我的编程语言空间中快速获得此查询的结果:

SELECT id FROM document WHERE ... whatever ...;

'whatever' 子句可能为空,因此该集合可以包含所有文档的 ID。

所以我的问题是:有没有办法将此查询的结果作为大小为 200 万位(~ 250k 数据)的位向量 BLOB 而不是潜在的 200 万个字符串化数字(~ 14Mo .. 不太好) .

在稀疏集的情况下,blob 压缩的额外荣誉:)

最佳答案

虽然性能会很糟糕,但此存储过程将为您提供所需的结果:

CREATE PROCEDURE ex12688666(whatever TEXT)
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT ''
proc: BEGIN
DECLARE not_found BOOL DEFAULT FALSE;
DECLARE max BIGINT UNSIGNED DEFAULT 0;
DECLARE len BIGINT UNSIGNED;
DECLARE i BIGINT UNSIGNED;
DECLARE pos BIGINT UNSIGNED;
DECLARE result LONGBLOB DEFAULT '';

DECLARE cur1 CURSOR FOR
SELECT id FROM ids WHERE id RLIKE whatever ORDER BY id;

DECLARE CONTINUE HANDLER FOR NOT FOUND SET not_found = TRUE;

SELECT MAX(id) INTO max FROM ids;

IF (max > 0) THEN
SET len = FLOOR((max + 7) / 8);
SET result = REPEAT("\0", len);

OPEN cur1;

loop1: LOOP
FETCH cur1 INTO i;
IF not_found THEN
LEAVE loop1;
END IF;

SET pos = FLOOR(i / 8) + 1;
SET result = CONCAT(
SUBSTRING(result, 1, pos - 1),
CHAR(ASCII(SUBSTRING(result, pos, 1)) | (1 << (i MOD 8))),
SUBSTRING(result, pos + 1)
);
END LOOP;

CLOSE cur1;
END IF;

SELECT HEX(result) AS result;
END;

我们返回 HEX(result) 用于说明目的。在实践中,可以替换

SELECT HEX(result) AS result;

简单地

SELECT result;

或者如果你想对结果进行 zlib 压缩:

SELECT COMPRESS(result) AS result;

应该得到您提到的额外荣誉。

参见 http://sqlfiddle.com/#!2/6f5c0/1用于交互式演示。

关于mysql - 如何从 Mysql select ID 查询中获取 bitset BLOB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12688666/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com