MYSQLデータベースパーティション、テーブル分割、ライブラリ分割、および読み書き分離の使用シーンと注意事項

3628 ワード

https://www.cnblogs.com/bluebluesky/articles/6413831.html
実はMYSQLデータベースの最適化の流れは大体以下の通りである: -> -> -> -> 注意:今できるだけMyISAMの代わりにInnoDBを使用して、表レベルのロックを使用する代価は大きい.
概要
一般的に、私たちのデータテーブルに保存されているデータがますます大きくなり、クエリーなどの操作に影響を及ぼし、古いデータアクセスが少ない場合、一般的にパーティションを使用して異なるディスクにデータを分散し、I/Oの負担を分散し、データをクエリーする際にも指定したパーティションをクエリーするだけでよい.
ただし、各テーブルのパーティションは1024を超えることはできませんが、実際にはパーティションが100に達すると基本的にパフォーマンスに影響します.この場合、テーブルをさらに分割する必要があります.分割テーブルは単一テーブルのパーティションに影響しません.両方とも使用する必要があります.
しかし、単一のデータベースの要求がパフォーマンスに影響を及ぼすほど同時に多くなると、ライブラリを分割し、読み書きを分離する手段が採用されますが、この場合、操作を簡素化するためにいくつかのミドルウェアが必要になる可能性があります.
パーティション
mysqlがサポートするパーティションタイプには、Range、List、Hash、Keyが含まれます.ここで、Rangeは一般的です.
  • RANGEパーティション:指定された連続区間に属する列値に基づいて、複数行がパーティションに割り当てられる.
  • LISTパーティション:RANGEによるパーティションと同様に、LISTパーティションは、カラム値に基づいて離散値セットの値を一致させることによって選択される.
  • HASHパーティション:テーブルに挿入する行の列値を使用して計算される、ユーザー定義式の戻り値に基づいて選択されるパーティション.この関数には、MySQLで有効な非負の整数値を生成する式が含まれます.
  • KEYパーティション:HASHによるパーティションと同様に、KEYパーティションは1つ以上のカラムの計算のみをサポートし、MySQLサーバは独自のハッシュ関数を提供します.整数値を含む列または複数の列が必要です.

  • パーティションの制限:
  • プライマリ・キーまたはユニーク・インデックスにはprimary key(id,username)などのパーティション・フィールドが含まれている必要がありますが、innoDBの大きな構築性能はよくありません.
  • 多くの場合、パーティションを使用するとプライマリ・キーを使用しないでください.そうしないと、パフォーマンスに影響を与える可能性があります.
  • 各テーブルは最大1024個のパーティションであり、マルチパーティションはメモリを大量に消費します.一般的に100個未満が
  • である
  • パーティションのテーブルは外部キーをサポートしていません.関連する論理制約はプログラムを使用して実現する必要があります.
  • パーティション化すると、インデックスが失効する可能性があります.パーティションの実行可能性を検証する必要があります.
  • create table user(
        id int not null auto_increment,
        username varchar(10),
        primary key(id)
    )engine = innodb charset=utf8
    partition by range (id)(
        partition user_1 values less than (10),
        partition user_2 values less than (20)
    );
    
           :
    maxvalue               20 id      user_3  
    alter table user add partition(
        partition user_3 values less than maxvalue
    );
        
    alter  table user drop partition user_3;
    

    このようにmysqlはパーティションを通じて異なるファイルにデータを保存し、インデックスもパーティション化していることがわかります.パーティション化されていないテーブルに比べて、パーティション化後の個別のデータベース・ファイルのインデックス・ファイルのサイズが著しく低下し、効率が著しく向上します.データを挿入し、クエリー文を分析して検証できます.
    insert into user values(null,'  ');
    explain partitions select * from user where id =1;
    

    これらのパーティションが存在する物理ディスクを完全に独立させることができ、ディスクIOのスループットを向上させることができます.
    CREATE TABLE users (  
           id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,  
           usersname VARCHAR(30) NOT NULL DEFAULT '',  
           email VARCHAR(30) NOT NULL DEFAULT ''  
    )  
    PARTITION BY RANGE (id) (  
           PARTITION p0 VALUES LESS THAN (3000000)  
           DATA DIRECTORY = '/data0/data'  
           INDEX DIRECTORY = '/data0/index',  
      
           PARTITION p1 VALUES LESS THAN (6000000)  
           DATA DIRECTORY = '/data1/data'  
           INDEX DIRECTORY = '/data1/index',  
      
           PARTITION p2 VALUES LESS THAN (9000000)  
           DATA DIRECTORY = '/data2/data'  
           INDEX DIRECTORY = '/data2/index',  
      
           PARTITION p3 VALUES LESS THAN MAXVALUE     
           DATA DIRECTORY = '/data3/data'   
           INDEX DIRECTORY = '/data3/index'  
    );
    

    サブテーブル
    表を分割する方法はパーティションと同じです.最も簡単な方法は、フィールドを型分けすることです.それから型取りクエリーでいいです.真ん中に連合クエリーが関係している可能性があります.注意すればいいです.
    集計表MERGE
    この場合、通常は古いサービスを維持し、性能が悪く、サービス中のデータ量が特に大きいため、コードを修正できない可能性があります.データテーブルはMyISAMエンジンです.このとき、複数のテーブルに分割し、データを対応するテーブルにコピーし、MERGEを使用して統合することで、サービスの最適化を変更しない目的を達成することができます.このとき、元の表は任意に処理できます.
    ライブラリ
    リファレンスhttps://www.cnblogs.com/phpshen/p/6198375.html