2013-01-14 36 views
0

在正常的MyISAM表(也可能是InnoDB)中,可以使用GROUP BY語句添加索引以提高查詢的性能,遵循以下規則:MySQL - 無法在組的HEAP(MEMORY)表中使用索引

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

我最近一直在做一些性能測試,嘗試MySQL的直接存儲在存儲器中(又名HEAP表)表的能力。我注意到一些奇怪的事情 - 查詢組在堆表中的運行速度遠遠低於MyISAM。在進一步的調查中,我觀察到「使用索引for group-by」在解析堆表查詢時沒有顯示(它們在MyISAM中執行)。

我一直試圖找到關於這個interent更多的信息,但無濟於事。在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不是堆表使用分組依據指標?

+0

是的,他們[可以做(http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html)。你如何做你的「相同」的副本? –

+0

我導出了表sql,並更改了引擎。我也嘗試在兩臺使用不同配置的不同服務器上創建新的超級簡單表,但HEAP表的btree索引獲得基數none,並且索引組by by not在解釋中未顯示。 – quano

+0

我試着複製粘貼在你鏈接的頁面中的創建表查詢,但它的行爲方式相同。 – quano

回答