0

通常の MyISAM テーブル (およびおそらく InnoDB も) では、ここで概説されているルールに従って、GROUP BY ステートメントを使用してクエリのパフォーマンスを向上させるためにインデックスを追加できます。

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

私は最近、いくつかのパフォーマンス テストを行っており、テーブルを直接メモリに格納する MySQL の機能 (別名 HEAP テーブル) を試しています。奇妙なことに気付きました - グループごとのクエリは、MyISAM よりもヒープ テーブルの方がはるかに遅く実行されます。さらに調査したところ、ヒープテーブルクエリをEXPLAINするときに「グループバイにインデックスを使用」が表示されないことがわかりました(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 はヒープテーブルのグループ by にインデックスを使用しませんか?

4

1 に答える 1

1

これは現在、確認済みのバグです。リンクを参照してください:

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

于 2013-01-15T19:37:19.533 に答える