Mysql 分庫、分表

Mysql Shardingsql

前言網站

  1)Sharding是按照必定規則從新分佈數據的方式spa

  2)解決單機寫入壓力過大和容量問題設計

  3)  解決單機查詢慢的問題code

  4)本文主要根據用戶登陸場景分析blog

Sharding規則get

  1)垂直拆分,通常是表中的字段比較多,按照業務分類拆分到不一樣的表中。it

  2)水平拆分,通常是表中的數據量巨大,按照特定規則拆分到不一樣的表中。io

    1. mod方式 table

    例:網站有N種(手機號、郵箱、第三方...)登陸方式   

function get_table_name($unique_name) {
    $tb_num = 8; // 表數量
    return 'login_' . intval(sprintf('%u', crc32($unique_name)) % $tb_num);
}
var_dump(get_table_name('username'));//login_7

    優勢:

      解決熱點問題

    缺點:

      數據分佈不平均。容易出現單表過大問題

      擴容時,須要從新遷移數據。

    2. range方式

    例:網站有N種(手機號、郵箱、第三方...)登陸方式,每一個表存1000W數據   

function get_table_name($unique_name) {
    $tb_split = 10000000; // 單表數據量
    return 'login_' . intval(sprintf('%u', crc32($unique_name)) / $tb_split);
}
var_dump(get_table_name('username'));//login_416

    優勢:

      不須要數據遷移

    缺點:

      數據分佈不平均。出現不少表

    3. 暫時先使用range方式,先把$tb_split設置大一點。須要擴容時在從新遷移數據把$tb_split改小。

       

Sharding後

  1)設計方案時儘可能避免數據遷移、熱點問題。同時要保證易於水平擴展

  1)全局自增id方案

  2)跨庫、跨表join

相關文章
相關標籤/搜索