2mysql分表 詳解mysql資料表的分表策略

2021-10-18 13:03:22 字數 4387 閱讀 9566

mysql分表方法:

方法一、

做資料庫集群! 主從資料庫 雙向熱備份(或一對多的資料庫實時備份策略),這樣可將資料庫查詢分攤到幾個伺服器去(可跟伺服器負載均衡結合起來架構)

優點:擴充套件性好,沒有多個分表後的複雜操作(php**)

缺點:單個表的資料量還是沒有變,一次操作所花的時間還是那麼多,硬體開銷大。

方法二、

根據特殊情況,按照特定規則分表:比如 使用者聊天表,

message_00,message_01,message_02……….message_98,message_99.然後根據使用者的id來判斷 這個使用者的聊天資訊放到哪張表裡面。

可以用hash的方式來獲得,可以用求餘的方式來獲得,方法很多,比如用hash的方法來獲得表名:

複製** **示例:

function get_hash_table($table,$userid) else{

$hash = substr($str, 0, 2);

return $table.'_'.$hash;

echo get_hash_table('message','user18991');     //結果為message_10

echo get_hash_table('message','user34523');    //結果為message_13

**說明:

user18991這個使用者的訊息都記錄在message_10這張表裡,user34523這個使用者的訊息都記錄在message_13這張表裡,讀取的時候,只要從各自的表中讀取即可。

優點:避免一張表出現幾百萬條資料,縮短了一條sql的執行時間

缺點:當一種規則確定時,打破這條規則會很麻煩,上面的例子中我用的hash演算法是crc32,如果我現在不想用這個演算法了,改用md5後,會使同乙個使用者的訊息被儲存到不同的表中,這樣資料亂套了。擴充套件性很差。

方法三:利用merge儲存引擎來實現分表

假如有一張使用者表user,有50w條資料,現在要拆成二張表user1和user2,每張表25w條資料,

複製** **示例:

create table `test`.`user` (

`id` int( 11 ) not null auto_increment primary key ,

`username` varchar( 300 ) character set utf8 collate utf8_general_ci not null ,

`pwd` varchar( 200 ) character set utf8 collate utf8_general_ci not null ,

`email` varchar( 300 ) character set utf8 collate utf8_general_ci not null

) engine = myisam default charset=utf8 auto_increment=1 ;

create table `test`.`user1` (

`id` int( 11 ) not null auto_increment primary key ,

`username` varchar( 300 ) character set utf8 collate utf8_general_ci not null ,

`pwd` varchar( 200 ) character set utf8 collate utf8_general_ci not null ,

`email` varchar( 300 ) character set utf8 collate utf8_general_ci not null

) engine = myisam default charset=utf8 auto_increment=1 ;

create table `test`.`user2` (

`id` int( 11 ) not null auto_increment primary key ,

`username` varchar( 300 ) character set utf8 collate utf8_general_ci not null ,

`pwd` varchar( 200 ) character set utf8 collate utf8_general_ci not null ,

`email` varchar( 300 ) character set utf8 collate utf8_general_ci not null

) engine = myisam default charset=utf8 auto_increment=1 ;

insert into `test`.`user` (`id`, `username`, `pwd`, `email`) values (null, 'user1', '123', '[email protected]');

insert into `test`.`user` (`id`, `username`, `pwd`, `email`) values (null, 'user2', '123', '[email protected]');

insert into `test`.`user` (`id`, `username`, `pwd`, `email`) values (null, 'user3', '123', '[email protected]');

insert into `test`.`user` (`id`, `username`, `pwd`, `email`) values (null, 'user4', '123', '[email protected]');

insert into user1(user1.id,user1.username,user1.pwd,user1.email) select user.id,user.username,user.pwd,user.email from user where user.id >=2;

insert into user2(user2.id,user2.username,user2.pwd,user2.email) select user.id,user.username,user.pwd,user.email from user where user.id >2;

drop table `user`;

create table `test`.`user` (

`id` int( 11 ) not null ,

`username` varchar( 300 ) character set utf8 collate utf8_general_ci not null ,

`pwd` varchar( 200 ) character set utf8 collate utf8_general_ci not null ,

`email` varchar( 300 ) character set utf8 collate utf8_general_ci not null ,

index ( `id` )

) engine = mrg_myisam union=(user1,user2) insert_method=last charset=utf8  auto_increment=1 ;

測試:複製** **示例:

insert into `user` (`id`,`username`, `pwd`,`email`) values(5,'user5','123','[email protected]');

insert into `user` (`id`,`username`, `pwd`,`email`) values(6,'user6','123','[email protected]');

insert into `user` (`id`,`username`, `pwd`,`email`) values(7,'user7','123','[email protected]');

insert into `user` (`username`, `pwd`,`email`) values('user8','123','[email protected]');

//這樣的話 id居然是0  這個有點奇怪,如果解決不了,每次插入新資料,要加上last_id。(php**得改)

如此分表的注意事項:

1.不能將merge儲存引擎變成其它儲存引擎

2.執行乙個 insert,資料進入第乙個或者最後乙個 myisam 表(取決於 insert_method 選項的值)。mysql確保唯一鍵值在那個 myisam 表裡保持唯一,但不是跨集合裡所有的表。

3. merge表 必須和分表的結構一模一樣····

優點:擴充套件性好,並且php**幾乎不用改

缺點:這種方法的效果比第二種要差一點

建議:具體情況具體分析,方法

一、方法

二、方法三綜合使用。

您可能感興趣的文章:

mysql不區分表名大小寫的設定方法

linux平台mysql區分表名大小寫的問題

設定mysql不區分表名稱大小寫

MySQL解析(2) MySQL版本

mysql ab目前維護的mysql版本主要包括 mysql 4.1 mysql 5.0 mysql 5.1 mysql 6.0 其中處於stable狀態的有mysql4.1 5.0,而mysql5.1處於rc beta 版,mysql 6.0 處於 alpha版。mysql 5.0是stable的...

MySQL 筆記2 MySQL 基礎

mysql 系列筆記是筆者學習 實踐mysql資料庫的筆記 mysql 資料庫基礎入門教程 mysql 官方文件 儲存引擎 儲存資料的技術。mysql中的資料可以用各種不同的技術儲存在檔案 或者記憶體 中,這些技術中的每一種技術都使用不同的儲存機制 索引技巧 鎖定水平並且最終提供廣泛的不同的功能和能...

MySQL學習 2 MySQL索引

6 索引設計原則 mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構 有序 在資料之外,資料庫系統還維護者滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引 一般來說索引本身也很...