0

私は非常に大きなテーブルを持っており、ID ルックアップのような非常に単純なクエリを実行しています。テーブルの行が増えるため、時間の経過とともにクエリが遅くなりました。1 秒で約 300 のクエリを実行すると、スクリプトの実行が遅くなり、メモリが 99% になります (メモリは DB のサイズよりも小さい) パフォーマンスを最大化するために、テーブルをパーティション分割およびサブパーティション化したいと考えています。のような 30 のテーブル)、私はパーティショニングに非常に慣れていないため、コードを追加してください。選択クエリは、id ルックアップと単純な挿入の where 句のみです。RAMをDBサイズよりも大きくアップグレードしたいのですが、それを避けたいのですが、パーティション分割よりも問題を解決できるかどうかわかりません。

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `url` (`url`(333)),
    INDEX `name` (`name`)
)
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=937

ここに私のクエリの例があります:

SELECT id FROM books WHERE url = 'blabla';
INSERT INTO user_books SET book_id = '3', user_id = '10';

各クエリには約 0.05 ~ 0.2 秒かかります

各テーブルに約500万から1000万行ありました。

DBサイズは10GB RAMを16GBにアップグレードすることを考えました

4

1 に答える 1

2

パーティションを追加してみたいだけなら、partition by key を使用することをお勧めします。これは基本的に、パーティション分割で指定された列に適用される内部ハッシュ関数を使用してテーブルをパーティション分割するだけです。

あなたの場合、クエリがid最も多く使用しているように見えます。これが主キーであるため、構文は非常に単純です。

CREATE TABLE `books` (
    `id` INT(10) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(200) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `picture` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `url` VARCHAR(500) NULL DEFAULT NULL COLLATE 'utf8_unicode_ci',
    `created` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    INDEX `url` (`url`(333)),
    INDEX `name` (`name`)
)
PARTITION BY KEY()
PARTITIONS 8;
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=937

上記により、8 つのパーティションが作成されます。partitioning 句で使用する列を指定していないため、MySQL はデフォルトで主キーを使用しますが、これはあなたのケースでは問題ありません。

列で使用される整数値が適度に分散されていると仮定するとid、各パーティションは約 1.25 GB になります。特定の ID に対してクエリを実行すると、1 つのパーティションからのみデータが選択されるようになり、アクセスが高速化されます。

ここで MySQL のドキュメントを参照できます: http://dev.mysql.com/doc/refman/5.5/en/partitioning-key.html

言うまでもなく、id は主キーなので、これはすでにかなりパフォーマンスが高いはずです。MyISAM を使用したインデックス + パーティションに適用される可能性のあるその他の警告についてはわかりません。私は主に InnoDb を使用していますが、クエリのパフォーマンスを向上させるために、少なくとも InnoDb を使用する場合はこれを行います。

于 2012-10-15T10:33:37.693 に答える