【MySQL性能最適化】MySQLライブラリの分割表と水平分割型取りケース(三)


原文へようこそ:【MySQL性能最適化】MySQLダイバーシチと水平分割ダイバーシチケース(三)
サブテーブルライブラリ
プロジェクトが大きい場合は、基本的に分表分庫を行います.後で、いつ分庫が必要か、いつ分表が必要かについて話します.
いつリポジトリが必要ですか
垂直分割
垂直分割とは、テーブルをモジュール別に異なるデータベース・テーブルに分割することです(もちろん、原則は第3のパターンを破壊しません).この分割は、大規模なWebサイトの進化の過程でよく見られます.1つのウェブサイトがまだ小さい时、小さい量の人だけが开発とメンテナンスに来て、各モジュールと表はすべていっしょにいて、ウェブサイトが绝えず豊かで大きくなる时、多くのサブシステムになって支えて、この时モジュールと机能によって表を区分する需要があります.実は、垂直分割に比べて更にサービス化改造であり、簡単に言えば、元の強い結合のシステムを複数の弱い結合のサービスに分割することであり、サービス間の呼び出しを通じて業務の需要を満たすため、テーブルを分解した後、異なるモジュールのテーブルを直接呼び出すのではなく、サービスの形式を通じて暴露しなければならない.最も重要な一環はサービス化改造であり、ユーザー、取引、店舗、宝物などの核心の概念を独立したサービスに抽出し、局所的な最適化と管理にも非常に有利であり、核心モジュールの安定性を保障し、垂直分割を分布式シーンに使用する.大きなチームが電子商取引プロジェクトをしているとき、基本的に1つのプロジェクトを分割し、nつの小さなプロジェクトに分割するメリットは、逆方向のサービスアーキテクチャに基づいて、複数の小さなプロジェクトを分割し、各小さなプロジェクトには独自のデータベースがあり、そうすると小さなプロジェクト間では互いに影響しません.これを垂直分割と呼びます.たとえば、会員データベース、受注データベース、支払いデータベースなど、開発チーム間の結合度を低減できます.例えば、あるチームがデータベースを切った場合、他のチームにはほとんど影響しません.すべてのデータベースが使用されている場合、すべてが停止しているかどうかは、そのデータベースに使用されているチームプロジェクトの進捗状況が延期されます.
いつ分表が必要ですか.
すいへいぶんかつ
垂直分割は、テーブルをモジュール別に異なるデータベースに分割するだけですが、単一テーブルのビッグデータ量の問題は解決されません.水平分割は、テーブルをあるルールに従って異なるテーブルやデータベースに分割することです.例えば、課金システムのように、ある期間のデータを処理するため、時間によってテーブルを分割することが適切である.一方、SaaSアプリケーションのように、ユーザ次元によってデータを分割するのが適切である.ユーザとユーザとの間の隔離のため、一般的に複数のユーザデータを処理する場合は存在せず、簡単にuser_id範囲で水平に切り分ける
なぜ表を分割する必要があるのか、例えば、1つの表、数十年のデータはすべてその表の中にあり、検索するには、インデックスを追加してもどのようにしても、クエリーには長い時間がかかります.この場合、分表、分表のルールを作る必要があります.一般的にはビジネスニーズに応じて決められます.統一的な分け方がない.例えば、私たちのビジネスシーンは、主にログを保存しています.ログは毎年保存するこの時期に表を分ける必要があります.年によって分けます.
テンセントのQQ号のように、何によって表を分けますか?もし桁数によってならば、最大の欠点は分部が均一ではありません!また会員システムの場合は、携帯電話番号で登録します.会員表には携帯電話番号の上位3位の分表(いくつかの項目はこのようにして、あまり問題ありません)があります.例えば136,138,155などですが、あまり均一ではありません.
水平分割(型取りアルゴリズム)で分割することが望ましい
1つのテーブルを3つのテーブルに分割する必要がある場合は、intプライマリ・キーなどの数値フィールドを使用できます.このとき,表中のデータのuseridフィールドを3に対して型取りを行い,その後異なる残数に対して型取りを行うここでの型取りフィールドは自動成長の実現型取りアルゴリズムを用いることができず,対応するuseridフィールド(型取りのためのフィールド)を格納する専門の表が必要である.行を挿入するとidになり、テーブルから対応するuseridを取り出し、過去に値を割り当てます.
分表が必要かどうかは、プロジェクトの経験と実際の業務状況に基づいています.一般的にMySQL単表1000 W程度のデータは問題ありません(アプリケーションシステムやデータベースなどの面で設計・最適化されていることが前提です)もちろん、分表が必要な場合は半年か1年前に計画する必要があります.
垂直分割と水平分割の一般的な理解:行を水平に分割し、行データを異なるテーブルに分割し、列を垂直に分割し、表データを異なるテーブルに分割します.
水平分割型取りアルゴリズムの例
型取りアルゴリズムを用いて表を分割する最大の利点は,非常に均一に分配できることである.
まず、user 0/user 1/user 2を3枚作成し、次にuuidテーブルを作成します.このテーブルの役割は、自己増加idを提供することです.データベースの作成:split_horizon
create table user0(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default ''
)engine=myisam charset utf8;

create table user1(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default ''
)engine=myisam charset utf8;

create table user2(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default ''
)engine=myisam charset utf8;


create table uuid(
    id int unsigned primary key auto_increment
)engine=myisam charset utf8;

機能は、サブテーブルを登録したり、サブテーブルのクエリー項目を行うのが簡単で、サブテーブルがどうなっているのかを見てみましょう.
サービスコード
package com.uifuture.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

/**
 * Created with IntelliJ IDEA.
 * User:    .
 * Date: 2018/2/5.
 * Time:    10:28.
 * Explain:
 */
@Service
public class UserService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    /**
     *      
     * @param name
     * @param pwd
     * @return
     */
    public String regit(String name,String pwd){
        //1.  userid ,-           ID
        String insertUUidSql = "insert into uuid values(null)";//     ,   id      
        jdbcTemplate.update(insertUUidSql);//  
        Long userid = jdbcTemplate.queryForObject("select last_insert_id()", Long.class);//           id
        //2.          -           
        String tableName = "user" + userid % 3;
        //3.         -     
        String insertUserSql = "INSERT INTO " + tableName + " VALUES ('" + userid + "','" + name + "','" + pwd + "');";
        System.out.println("insertUserSql:" + insertUserSql);
        jdbcTemplate.update(insertUserSql);
        return "success";
    }

    /**
     *   userid  name
     * @param userid
     * @return
     */
    public String get(Long userid) {
        //     
        String tableName = "user" + userid % 3;
        String sql = "select name from " + tableName + " where id="+userid;
        System.out.println("SQL:" + sql);
        return jdbcTemplate.queryForObject(sql, String.class);//     name
    }


}

コントローラコード
package com.uifuture.controller;

import com.uifuture.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created with IntelliJ IDEA.
 * User:    .
 * Date: 2018/2/5.
 * Time:    10:44.
 * Explain:
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;

    /**
     *        
     * @param name
     * @param pwd
     * @return
     */
    @RequestMapping("/regit")
    public String regit(String name, String pwd) {
        return userService.regit(name, pwd);
    }

    /**
     *     name
     * @param id
     * @return
     */
    @RequestMapping("/get")
    public String get(Long id) {
        return userService.get(id);
    }

}

他のコードはgithubの項目を参照してください.
プロジェクトのアドレス:
GITHUBソースアドレス:
【私を訪問します】
分表の後にも欠点があります.1.ページングクエリ2.クエリーは非常に制限されています.たとえば、私はそのサブテーブルのキーフィールドをクエリーしません.
したがって、通常、プライマリ・テーブルとセカンダリ・テーブルのプライマリ・テーブルには、すべてのデータが格納されます.次の表は具体的な業務の需要によって分表を行ってmycar中間部品は分表の機能を持って、学ぶことができます
モデリングアルゴリズムの欠点は、もし私たちのテーブルが変わったら、私たちが再分割する必要があります.面倒です(ハハ、アリクラウドのrdsクラウドデータベースを使うことができます.そうすれば、読み書き分離、分表ライブラリなどに関心を持つ必要はありません.rdsは二次開発のデータベースなので、性能的には他の関係型データベースよりずっと速いです.自分で理解することができます).
この文章は[記憶に精通している]から作成され、すべての権利が保持されている.転載を歓迎して、分かち合うのは進歩の源泉です.
転載は出典を明記してください.http://chenhaoxiang.cn/2018/02/05/2316/本文は【記憶に詳しいブログ】から