mysqlテーブルパーティションを使用してビッグデータ量のテーブルを最適化

2910 ワード

会社のデータベースの実際の状況によっては、受注表が予想より拡張速度が速い可能性があります.ここでは、最適化案を事前に準備する必要があります.従来の案は分表または分庫ですが、mysqlの表パーティションを使用して最適化するのが最善です.ただし、テーブルパーティションが確立されるとmysqlクエリーキャッシュが無効になることに注意してください.一時的にテーブルを分割するメリットは、更新、削除、ロック処理の時間が減少することですが、クエリーがテーブルパーティションフィールドに対して行われていない場合、クエリーの時間はクエリーキャッシュの失効によってかえって増加するため、取捨選択する必要があります.
ステップ1:テーブルパーティションは、テーブルの作成時にルールを作成する必要があるため、テーブルパーティションルールが作成されていないテーブルは、インポート処理を再実行する必要があります.方法は次のとおりです.
#    HASH   ,mysql   HASH                ,                               。    id  hash    2    
CREATE TABLE `creater_bak` (
  `id` int(11) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH(id) PARTITIONS 2

作成が完了したら、元のテーブルデータのインポートを開始します.
insert into creater_bak select * from creater;

インポート後の新しいテーブルデータは、異なる2つのテーブルパーティションに分散されます.
データ量が非常に大きく、予め設定されたテーブルパーティションの数が少なすぎると判断した場合、テーブルパーティションを追加できます.mysqlは自動的に再割り当てされます.
#    8    ,        2 ,  10     
ALTER TABLE `creater_bak` ADD PARTITION PARTITIONS 8;

最後にテーブル名を元のテーブル名に変更すればいいです.
PS:以下はRANGE形式の表パーティションを使用して、その中のいくつかの注意点HASH表パーティションも同様に注意する:
1.RANGE形式でテーブルパーティションを作成する場合は、次のようなルールを設定する必要があります.
CREATE TABLE `creater_bak` (
  `id` int(11) NOT NULL,
  `name` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE(id) (
    PARTITION p0 VALUES LESS THAN (500),
    PARTITION p1 VALUES LESS THAN (1000),
    PARTITION p2 VALUES LESS THAN MAXVALUE
)

 2.規則的なテーブルパーティションを変更したい場合は、追加するしかないので注意してください.勝手に削除しないでください.ここでテーブルパーティションを削除すると、そのテーブルパーティションの内部データも一緒に削除されます.くれぐれも注意してください.また、MAXVALUEが設定されている場合は追加できません.MAXVALUEのテーブルパーティションを削除してから追加できますが、削除したMAXVALUEパーティションにデータがあるかどうかに注意し、ある場合は勝手に削除できません.最善の方法は、新しいテーブルを再構築し、テーブルが作成時にルールを再制定した後、古いテーブルを新しいテーブルにインポートすることで、データが失われないことを保証します.パーティションは削除しないほうがいいですが、表パーティションの削除方法と新しい表パーティションの追加方法については、次のように説明します.
#     MAXVALUE     (         ,         )
ALTER TABLE `creater_bak` drop PARTITION p2;
#       ,          ,     ,     500
ALTER TABLE `creater_bak` add PARTITION(PARTITION p2 VALUES LESS THAN (1500))
ALTER TABLE `creater_bak` add PARTITION(PARTITION p3 VALUES LESS THAN MAXVALUE)

最後に、次の文を使用して、パーティション検索を表示します.
EXPLAIN PARTITIONS select * from `creater_bak` b1 where b1.`id`=11

最後に公式中国語のドキュメントを添付します.
  http://dev.mysql.com/doc/refman/5.1/zh/partitioning.html
MySQL 5.5パーティション機能の強化について