Mysqlビッグデータにおけるテーブルパーティションの応用

7569 ワード

一、MysqlテーブルパーティションをサポートするにはMYSQLバージョンが5.1以上で、5.1~を含む
二、表パーティションの役割:MYSQLの実行効率を増加し、以下の点で表パーティションがどのようにMYSQLの実行効率を増加したかを分析することができる.
1.単一のディスクまたはファイルシステムパーティションより多くのデータを保存できる.
2、保存の意味を失ったデータについては、通常、それらのデータに関連するパーティションを削除することで、それらのデータを容易に削除することができる.
3、いくつかのクエリは、主に1つの与えられたWHERE文を満たすデータによって1つまたは複数のパーティション内にのみ保存することができ、これにより、検索時に他の残りのパーティションを検索する必要がなくなります.
4、SUM()やCOUNT()のような集約関数に関するクエリは、並列処理が容易である.このクエリの簡単な例は、「SELECT salesperson_id、COUNT(orders)as order_total FROM sales GROUP BY salesperson_id;」である.パラレル(Parallel)を使用すると、クエリは各パーティションで同時に実行でき、最終的な結果はすべてのパーティションを合計して得られる結果だけです.
5.複数のディスクにわたってデータ・クエリーを分散することで、より大きなクエリー・スループットを得る.
三、通俗的な講表区分は一つの大きな表を、条件によっていくつかの小さな表に分割することである.
四、表パーティションにはどのようなタイプがありますか.
RANGEパーティション:指定された連続区間に属するカラム値に基づいて、複数行をパーティションに割り当てる.
LISTパーティション:RANGEによるパーティションと同様に、LISTパーティションは、カラム値に基づいて離散値セットの値を一致させることによって選択されます.
HASHパーティション:テーブルに挿入するローの列値を使用して計算される、ユーザー定義式の戻り値に基づいて選択されるパーティション.この関数には、MySQLで有効な非負の整数値を生成する式が含まれます.
KEYパーティション:HASHパーティションと同様に、KEYパーティションは1列または複数列の計算のみをサポートし、MySQLサーバは独自のハッシュ関数を提供します.整数値を含む列または複数の列が必要です.
五、細分タイプ
RANGEパーティション
<1>パーティションを含むテーブルの作成
CREATE TABLE part_tab( c1 int default NULL, c2 varchar(30) default NULL, c3 date default NULL) engine=myisam PARTITION BY RANGE (year(c3)) (PARTITION p0 VALUES LESS THAN (1995), PARTITION p1 VALUES LESS THAN (1996) , PARTITION p2 VALUES LESS THAN (1997) , PARTITION p3 VALUES LESS THAN (1998) , PARTITION p4 VALUES LESS THAN (1999) , PARTITION p5 VALUES LESS THAN (2000) , PARTITION p6 VALUES LESS THAN (2001) , PARTITION p7 VALUES LESS THAN (2002) , PARTITION p8 VALUES LESS THAN (2003) , PARTITION p9 VALUES LESS THAN (2004) , PARTITION p10 VALUES LESS THAN (2010), PARTITION p11 VALUES LESS THAN MAXVALUE);

<1>パーティションを含まないテーブルの作成
CREATE TABLE no_part_tab( c1 int default NULL, c2 varchar(30) default NULL, c3 date default NULL) engine=myisam

<3>ストレージ・プロシージャを作成し、テストのためにテーブルに800000個のデータを挿入
CREATE PROCEDURE load_part_tab() begin declare v int default 0;
while v < 8000000
do
insert into part_tab
values (v,'testing partitions',adddate('1995-01-01',(rand(v)*36520) mod 3652));
set v = v + 1;
end while;
end

<4>未パーティションテーブルへの再書き込み
insert into no_part_tab select * from part_tab;

<5>はい、すべてのテーブルデータの準備が終わりました.次にテストをします.
select count(*) from no_part_tab where c3 >date('1995-01-01') and c3 < date('1995-12-31');

    :[SQL]  select count(*) from no_part_tab where c3 >date('1995-01-01') and c3 <date('1995-12-31');      : 0   : 2.594ms     : select count(*) from part_tab where c3 >date('1995-01-01') and c3 < date('1995-12-31');     :[SQL] select count(*) from part_tab where c3 > date('1995-01-01') and c3 <date('1995-12-31');
     : 0
  : 0.297ms

同じデータを読み込んで、パーティションがパーティション化されていない2つのテーブルと異なる同じレベルのデータ~を読み取ると、次は自分のビッグデータのテーブルを修正することができます
ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO ( PARTITION s2009 VALUES LESS THAN (201001), PARTITION s2010 VALUES LESS THAN (201004) );