1

如果以下事情是可能的,那就太好了:

假设我有一个 '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 压缩的额外赞誉:)

4

1 回答 1

3

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

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 。

于 2012-10-02T13:35:03.890 回答