mysql根據編碼分表 mysql分表認知

2021-10-19 19:39:52 字數 3250 閱讀 7398

第一種分表方法:通過merge生成合併表的形式,該方法用於已經存在的大表需要分表的情況

舉例情況:good表中有300萬條資料,需要分成2個分表g1和g2

步驟1:備份good表,以免操作失敗,用於恢復資料

步驟2:將good表中的資料分攤到分表中去:

1.使用程式處理,

2.在mysql中使用 create table g1 select * from good where ...., 需要注意字元,字段型別等問題

insert into g1 select * from good where .....,  需要先手動建表

步驟3:刪除good表,通過merge重新建立合併表good,語句如下:

create table good (

) type=merge union=(分表1,分表2) insert_method=last;

ps:insert_method引數用於決定當向合併表中插入資料時候,資料真正插入的是哪個分表,last表示向最後乙個分表插入資料,first則是向第一分表插入, 0表示不允許插入

建立合併表會碰到不少建立不成功的情況,需要看情況處理,碰到的一些情況:

1.分表和主表的字段總數和型別需要一致,包括列名、順序,union中的表必須同屬乙個database

2.分表型別必須是myisam的

3.合併表中的「索引字段」必須在分表中都存在

4.定義在合併表中的索引沒有任何作用,索引是由分表控制的,例如兩個分表中存在著同樣的乙個索引,那麼在merge表中會有兩個一樣的索引,也就說每個分表的索引在merge表中都會存在,所以在merge表中不能根據該索引進行唯一性檢索

5.可以通過修改.mrg檔案(在mysql對應的資料庫目錄中)來修改merge表,每個基本表的名字佔一行。注意:修改後要通過flush tables重新整理表快取。

建立成功後,直接訪問合併表即可

上面的方法的php實現**如下:

$con = new pdo("mysql:host=localhost;dbname=test", 'root', 'ajia123');

$sql = "select count(*) from good";

$rel = $con->query($sql)->fetch();

$totalrow = isset($rel[0]) ? $rel[0] : 1;       //合併表的總記錄數

$tableperrow = 1000000;

$item        = ceil( $totalrow/$tableperrow );  //每個分表的記錄數

for( $i=1; $i<=$item; $i++)";

//先建立分表,再插入記錄數

$sql = "create table `g` (

`id` int(11) not null default '0',

`name` char(20) not null default '',

`create_time` timestamp not null default '0000-00-00 00:00:00',

`the_date` int(8) default '0'

) engine=myisam default charset=utf8;";

$con->query($sql);

$start = (($i-1)*$tableperrow+1);

$end   = ($i*$tableperrow);

$sql2  = "insert into g select * from good where id between and ";

$con->query($sql2);

//生成合併表

$allsql = "create table gg (

`id` int(11) not null,

`name` char(20) character set utf8 not null default '',

`create_time` timestamp not null default '0000-00-00 00:00:00',

`the_date` int(8) default '0'

) type=merge union=(".implode(",", $tablename).") insert_method=last;";

$con->query($allsql);

第二種分表方式:在設計表的階段就考慮需要分表的情況

舉例情況:表good需要分表為10個分表(分表名稱為:g1,g2,g3 ....),資料儲存根據雜湊演算法得出訪問的分表表名

步驟一:建立分表和合併表的方式和**與第一種方式的**類似,只是不需插入資料到分表,而且表中需要有唯一值欄位(我們假設該欄位名為:unique_filed)

步驟二:根據雜湊演算法獲取對應資料記錄應該儲存到的分表名,從而將資料儲存到對應的分表中去,**如下:

//$table:分表的字首, $flag:記錄的唯一字段值,$max:分表的總數

function get_hash_table($table, $flag ,$max=10) ` (

`unique_filed` char(30) not null default '',

`create_time` timestamp not null default '0000-00-00 00:00:00',

`the_date` int(8) default '0'

) engine=myisam default charset=utf8;";

$con->query($sql);

$tablename = "";

$allsql = "create table if not exists all_cg (

`unique_filed` char(30) character set utf8 not null default '',

`create_time` timestamp not null default '0000-00-00 00:00:00',

`the_date` int(8) default '0'

) type=merge union=(".implode(",", $tablename).") insert_method=last;";

$con->query($allsql);

//下面是資料訪問

//生成唯一標示值

function get_unique_flag() (unique_filed) value ('') ";

$con->query($sql);

mysql 修改表的編碼 Mysql表編碼檢視修改

1.建立庫時指定編碼 create database testdb default charset gbk 2.修改庫的編碼 alter database testtable default character set utf8 collate utf8 bin 3.修改表的編碼 alter tab...

mysql分表準則 Mysql分表準則

mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6 sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特點來衡...

mysql分表的原則 Mysql分表準則

mysql分表準則 在大量使用mysql時,資料量大 高訪問時,為了提高效能需要分表處理,簡介下mysql分表的標準,後續會繼續補充 環境 業務型別 oltp 硬體 cpu 8cpu 2.4ghz mem 48g 磁碟 raid5 6sas 什麼樣的表需要拆分 根據表的體積 表的行數 訪問特 mys...