MySQL-パーティションテーブル-1


mysqlのデータベースlearnディレクトリ構造:
表salesの定義を見てみましょう.
show create table sales \G
*************************** 1. row ***************************
Table: sales
Create Table: CREATE TABLE `sales` ( `id` int(11) NOT NULL AUTO_INCREMENT, `amount` double NOT NULL, `order_day` datetime NOT NULL, PRIMARY KEY (`id`,`order_day`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /*!50100 PARTITION BY RANGE (YEAR(order_day)) (PARTITION p_2010 VALUES LESS THAN (2010) ENGINE = InnoDB, PARTITION p_2011 VALUES LESS THAN (2011) ENGINE = InnoDB, PARTITION p_2012 VALUES LESS THAN (2012) ENGINE = InnoDB, PARTITION p_catchall VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ 1 row in set (0.00 sec)

表p_keyの定義
show create table p_key \G
*************************** 1. row ***************************
Table: p_key
Create Table: CREATE TABLE `p_key` ( `id` int(10) NOT NULL AUTO_INCREMENT, `keyname` char(20) DEFAULT NULL, `keyval` varchar(1000) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 /*!50100 PARTITION BY KEY (id) PARTITIONS 4 */ 1 row in set (0.01 sec)

MyISAMエンジンの場合、1枚のテーブルには3つのファイルが格納され、fmストレージテーブル構造、myiストレージインデックス、mydストレージデータが格納されます.でもp_key対応のもう一つのファイルp_key.par.
Rangeパーティションのテーブルfuhui_を再作成log、体験パーティションクエリー:
DROP TABLE IF EXISTS fuhui_log;
CREATE TABLE fuhui_log ( object_id int(11), title varchar(20) NOT NULL , content varchar(20) , time int(11), primary key (object_id) ) PARTITION BY range (object_id) ( PARTITION p1 VALUES less than (5000), PARTITION p2 VALUES less than (10000), PARTITION p3 VALUES less than MAXVALUE );

ストレージ・プロシージャをカスタマイズし、データベースに20000個のデータを挿入します.
delimiter //
create procedure fun_fuhui_log() begin declare i int;
    set i = 1;
    while i < 20000 do
        insert into fuhui_log(object_id,title,content,time) values (i,concat('title_',i),'test content',i);
        set i = i+1;
    end while;
end
//

ストアド・プロシージャを呼び出し、データを挿入します.
delimiter ;
call fun_fuhui_log();

挿入データの取得:
 select count(*) from fuhui_log;

クエリーの結果は19999で、時間:1 row in set(0.01 sec);
select * from fuhui_log where object_id = 13588;

消費時間0.00 sec
上記の手順に従って、基本テーブルを作成し、ストレージ・プロシージャを変更して、同じデータを挿入します.
DROP TABLE IF EXISTS fuhui_log2;
CREATE TABLE fuhui_log2 ( object_id int(11), title varchar(20) NOT NULL , content varchar(20) , time int(11), primary key (object_id) );

データ構造の設計が簡単すぎて、データ量が小さすぎて、効果が見えないので、ストレージプロセスを再修正して、80000本のデータを挿入します.
while i < 80000 do
        replace into fuhui_log2(object_id,title,content,time) values (i,concat('title_',i),'test content',i);
        set i = i+1;
end while;
select count(*) from fuhui_log2;

実行結果:1 row in set(0.02 sec)
select count(*) from fuhui_log;

実行結果:1 row in set(0.03 sec)【論理に従ってカードを出さなかった】
この例は失敗しました.テーブル構造を変更してprimary keyを削除します.
 alter table fuhui_log drop primary key;
 alter table fuhui_log2 drop primary key;

例は依然として失敗しており,実行の効率は発見しにくい.
select * from fuhui_log where object_id = 56770 \G

消費時間:0.05 sec
select * from fuhui_log2 where object_id = 56770 \G

消費時間0.06 sec
count統計の場合fuhui_log比fuhui_log 2は時間がかかり、countの並列計算は、私に汚されました.
パーティション構造の変更、再計算:
 alter table fuhui_log reorganize partition p3 into ( partition p3_1 values less than (30000), partition p3_2 values less than (50000), partition p3_3 values less than MAXVALUE);

再パーティション化の結果を表示するには、次の手順に従います.
select table_schema,table_name,partition_name,PARTITION_METHOD from infor mation_schema.partitions where table_name='fuhui_log';

次に再計算します.
select count(*) from fuhui_log ;

実行効果0.04 sec、fuhui_log 2の統計時間は等しくなった.でも
select * from fuhui_log where object_id = 56770 \G

実行時間が0.02 secになりました
こんなに長い間書いていたとは,きょうはこれでやめましょう