3

game_logフィールドといくつかのフィールドidを持つテーブルがあります。game_idvarchar

id主キーであり、game_id非一意キーです。

よくある質問は2つあります。

SELECT * FROM game_log ORDER BY id DESC LIMIT 20
SELECT * FROM game_log WHERE game_id = <value> ORDER BY id DESC

テーブルは巨大です(6.1GBと32M行)。InnoDB。その中の行はランダムに追加されています(クエリごとに1つ)。また、一部のゲームは削除されています。

ディスクIOを減らし、応答性を向上させる必要があります。

使用するkeyか、rangeパーティション化する必要がありますか?の場合rangeidまたはによってgame_id?理論はありますか?

4

1 に答える 1

4

範囲によるパーティショニングを使用します。

キーでパーティションを作成する場合、両方のサンプルクエリがすべてのパーティションにアクセスする必要があります。

理論では、KEYによるパーティション分割はハッシュによるパーティション分割に似ており、主キーの連続する値は別々のパーティションに格納されるようにバインドされています。id値の範囲をクエリすると、パーティションのプルーニングが台無しになります。

デモ:

CREATE TABLE `game_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `game_id` int(11) NOT NULL DEFAULT '0',
  `xyz` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`id`,`game_id`)
) 
PARTITION BY KEY ()
PARTITIONS 13;

INSERT INTO game_log (game_id) VALUES (1), (2), (3), (4), (5), (6);

EXPLAIN PARTITIONS SELECT * FROM game_log ORDER BY id DESC LIMIT 3\G
           id: 1
  select_type: SIMPLE
        table: game_log
   partitions: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12

EXPLAIN PARTITIONS SELECT * FROM game_log WHERE game_id = 4 ORDER BY id DESC LIMIT 3\G
           id: 1
  select_type: SIMPLE
        table: game_log
   partitions: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12

一方、game_idで範囲ごとにパーティションを作成すると、少なくとも特定のgame_idをクエリするときに、パーティションのプルーニングを利用できます。ただし、id descによるgame_idの順序に対するクエリは、すべてのパーティションに影響を与えることになります。

CREATE TABLE `game_log` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `game_id` int(11) NOT NULL DEFAULT '0',
  `xyz` varchar(15) DEFAULT NULL,
  PRIMARY KEY (`id`,`game_id`)
)
PARTITION BY RANGE (game_id)
(PARTITION p1 VALUES LESS THAN (3),
 PARTITION p2 VALUES LESS THAN (6),
 PARTITION p3 VALUES LESS THAN MAXVALUE);

INSERT INTO game_log (game_id) VALUES (1), (2), (3), (4), (5), (6);

EXPLAIN PARTITIONS SELECT * FROM game_log ORDER BY id DESC LIMIT 3\G
           id: 1
  select_type: SIMPLE
        table: game_log
   partitions: p1,p2,p3

EXPLAIN PARTITIONS SELECT * FROM game_log WHERE game_id = 4 ORDER BY id DESC LIMIT 3\G
           id: 1
  select_type: SIMPLE
        table: game_log
   partitions: p2
于 2013-03-26T03:33:21.773 に答える