在普通的 MyISAM 表(也可能是 InnoDB)中,您可以使用 GROUP BY 语句添加索引以提高查询的性能,遵循此处列出的规则:
http://dev.mysql.com/doc/refman/5.6/en/group-by-optimization.html
我最近一直在做一些性能测试,尝试 MySQL 将表直接存储在内存中的能力(又名 HEAP 表)。我注意到一些奇怪的事情——group by 查询在堆表中的运行速度比在 MyISAM 中慢得多。经过进一步调查,我观察到“使用索引进行分组”在解释堆表查询时没有显示(它们在 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不使用堆表中的group bys索引吗?