ホームページ >データベース >mysql チュートリアル >MySQL ビッグ データ テーブルの水平パーティション最適化の詳細な手順

MySQL ビッグ データ テーブルの水平パーティション最適化の詳細な手順

不言
不言転載
2018-12-30 09:44:515260ブラウズ

この記事の内容は、MySQL ビッグ データ テーブルの水平パーティション最適化の詳細な手順に関するもので、必要な方は参考にしていただければ幸いです。

実行中の大きなテーブルをパーティション テーブルに変更する

この記事のコードは、次の基準に基づいて月ごとの水平パーティション化に限定されています。データ時間 コードを変更して他の要件を実装することもできます。

1. パーティション テーブルを作成します。

このテーブルのテーブル フィールドは、これらのテーブル フィールドとまったく同じです。パーティション

CREATE TABLE `metric_data_tmp`  (
    id bigint primary key auto_increment,
    metric varchar(128),
    datadt datetime not null unqine,
    value decimal(30, 6)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8
partition by range (to_days(DATADT)) (
    PARTITION p201811 VALUES LESS THAN (to_days("2018-12-01")),
    PARTITION p201812 VALUES LESS THAN (to_days("2019-01-01")),
    PARTITION p201901 VALUES LESS THAN (to_days("2019-02-01")),
    PARTITION p201902 VALUES LESS THAN (to_days("2019-03-01")),
);

2 を含む元のテーブルのデータを insert を通じて一時テーブル

  • に直接コピーします。 ステートメント

insert into metric_data_tmp select * from metric_data;
  • データの量が非常に多いため、select into outfile、Load data file を使用してエクスポートし、 import

SELECT * INTO OUTFILE 'data.txt' FIELDS TERMINATED BY ',' FROM metric_data;
LOAD DATA INFILE 'data.txt' INTO TABLE metric_data_tmp FIELDS TERMINATED BY ',';

3. パーティション テーブルと履歴テーブルの名前を変更します:

rename table metric_data to metric_data_bak;
rename table metric_data_tmp to metric_data;

4. スケジュールされた次の月のパーティションを自動的に作成します。データベースのタスク

  • ストアド プロシージャ

delimiter $$
use `db_orbit`$$
drop procedure if exists `create_partition_by_month`$$
create procedure `create_partition_by_month`(in_schemaname varchar(64), in_tablename varchar(64))
begin
    # 用于判断需要创建的表分区是否已经存在
    declare rows_cnt int unsigned;
    # 要创建表分区的时间
    declare target_date timestamp;
    #分区的名称,格式为p201811
    declare partition_name varchar(8);
        
    #要创建的分区时间为下个月
    set target_date = date_add(now(), interval 1 month);
    set partition_name = date_format( target_date, 'p%Y%m' );
        
    # 判断要创建的分区是否存在
    select count(1) into rows_cnt from information_schema.partitions t where table_schema = in_schemaname and table_name = in_tablename and ifnull(t.partition_name, '') = partition_name;
    if rows_cnt = 0 then
        set @sql = concat(
            'alter table `', 
            in_schemaname, 
            '`.`', 
            in_tablename, 
            '`',
            ' add partition (partition ', 
            partition_name, 
            " values less than (to_days('",
            date_format(DATE_ADD(target_date, INTERVAL 1 month), '%Y-%m-01'), 
            "')) engine = innodb);" 
        );
        prepare stmt from @sql;
        execute stmt;
        deallocate prepare stmt;
     else
       select concat("partition `", partition_name, "` for table `",in_schemaname, ".", in_tablename, "` already exists") as result;
     end if;
end$$
delimiter ;
  • スケジュールされたタスクを作成し、ストアド プロシージャを定期的に実行するパーティションを作成するための

DELIMITER $$
#该表所在的数据库名称
USE `db_orbit`$$
CREATE EVENT IF NOT EXISTS `generate_partition_for_metric_data`
ON SCHEDULE EVERY 1 MONTH   #执行周期,还有天、月等等
STARTS '2019-03-15 00:00:00'
ON COMPLETION PRESERVE
ENABLE
COMMENT 'Creating partitions'
DO BEGIN
    #调用刚才创建的存储过程,第一个参数是数据库名称,第二个参数是表名称
    CALL db_orbit.create_partition_by_month('db_orbit', 'metric_data');
END$$
DELIMITER ;

5. その他

  • テーブルのパーティション化を表示するためのSQL

rreeee

以上がMySQL ビッグ データ テーブルの水平パーティション最適化の詳細な手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。