MySQL - 无法在HEAP(MEMORY)表中使用索引进行分组依据

时间:2013-01-14 17:37:36

标签: mysql optimization

在正常的MyISAM表(也可能是InnoDB)中,您可以使用GROUP BY语句添加索引以提高查询性能,遵循此处列出的规则:

http://dev.mysql.com/doc/refman/5.6/en/group-by-optimization.html

我最近一直在做一些性能测试,试用MySQL将表直接存储在内存中的能力(a.k.a.HEAP表)。我注意到一些奇怪的事情 - 查询组在堆表中的运行速度远远低于MyISAM。经过进一步调查后,我观察到“使用索引进行分组”在EXPLAINing堆表查询时没有显示(它们在MyISAM中进行)。

我一直试图在互联网上找到更多关于此的信息,但无济于事。是否无法在HEAP表中使用group by的索引?

简单示例:

-- Setting everything up

SET max_heap_table_size = 104857600;

CREATE TABLE lookup_mem
    (id INT, INDEX USING BTREE (id))
    ENGINE = MEMORY;

CREATE TABLE lookup_hdd
    (id INT, INDEX USING BTREE (id))
    ENGINE = MYISAM;


DELIMITER $$

CREATE PROCEDURE `populate_table`()
BEGIN
    DECLARE count INT DEFAULT 0;
    WHILE count < 3000000 DO
        INSERT INTO lookup_mem SET id = ROUND(RAND()*100);
        SET count = count + 1;
    END WHILE;
END$$

DELIMITER ;



CALL populate_table;

INSERT INTO lookup_hdd SELECT * FROM lookup_mem;

现在到了有趣的东西:

EXPLAIN SELECT * FROM lookup_mem GROUP BY id;

-- gives
-- 1, SIMPLE, lookup_mem, index, , id, 5, , 3000000, 

EXPLAIN SELECT * FROM lookup_hdd GROUP BY id;

-- gives
-- 1, SIMPLE, lookup_hdd, range, , id, 5, , 101, Using index for group-by





SELECT * FROM lookup_mem GROUP BY id;

-- takes 1.216 seconds

SELECT * FROM lookup_hdd GROUP BY id;

-- takes 0.001 seconds

mysql是否在堆表中不使用索引作为分组?

1 个答案:

答案 0 :(得分:1)

现在这是一个经过验证的错误。见链接:

http://bugs.mysql.com/bug.php?id=68086