如何从Mysql select ID查询中获取位集blob?

如何从Mysql select ID查询中获取位集blob?,mysql,blob,bitset,Mysql,Blob,Bitset,如果能做到以下几点,那就太好了: 假设我有一个“document”mysql表,其中包含一个文档“id”和一些其他列: CREATE TABLE document(id INT AUTO_INCREMENT NOT NULL, ....); 可能有很多文档,但现在我只有200万 我希望在我的编程语言空间中快速获得此查询的结果: SELECT id FROM document WHERE ... whatever ...; 子句“whatever”可能为空,因此集合可以包含所有文档的id 所以

如果能做到以下几点,那就太好了:

假设我有一个“document”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;
简单地

SELECT result;
或者,如果要对结果进行zlib压缩:

SELECT COMPRESS(result) AS result;
这应该得到你提到的额外荣誉


有关交互式演示,请参见。

Hmm。。。这真的属于数据库层吗?我能想到的在MySQL中实现这一点的唯一方法是,在组聚合期间,编写一个初始化然后更新
BLOB
值的函数;如果不局限于64位精度的话,我想如果本机无法做到这一点,一个带有签名BLOB f(id\u query,id\u name,max\u id)的新函数可以完成这项工作。我想我得从我的C编译器中吹掉灰尘:)
SELECT COMPRESS(result) AS result;