當使用者數量達到百萬甚至千萬級別的時候,可能無法靠單標滿足現有需求。此時常用的處理方式就是分庫分表。這裡介紹乙個簡單的分表方法。
對使用者進行分表,首先要解決的是將乙個使用者分配到那個表,然後如何知道去哪個表查詢該使用者的資料。解決了這個兩個問題。無論將該使用者的資料放在哪個表都無所謂。
首先來看乙個方法:
function gethash($uid)
該方法完成了以下步驟:
(1)通過迴圈冗餘校驗,每個字串都會生成乙個固定的數字。
(2)用該數字對512取模得到乙個0<=x<512的數字
(3)再用16進製制格式化,可生成乙個固定的3個字元的字串。
(4)該方法的作用可以通過使用者id生成乙個固定的3個字元的字串。根據該字串可將該使用者分配到對應的表中。
不論使用者id是什麼,通過迴圈冗餘校驗後都能得到乙個數字。將該數字取模。然後將餘數格式化成字串。(當然也可以不格式化,直接用數字也可以。)然後用該字串做字首或者字尾建立使用者表。
例如:我先以固定字串為字尾,在user資料庫建立了user_000、user_001 … user_1ff共512張使用者表。(當然512張表的結構是一模一樣的。)
$model = new model();$db = 'userdb';
for($i=0; $i
<512; $i++)`.`user_` (
`uid` bigint(20) not null,
`name` int(11) not null,
`server` int(11) not null,
`cid` int(11) not null,
`aid` int(11) not null,
`areaid` int(11) not null,
`eventtime` int(11) not null,
`eventdate` date not null,
`eventhour` int(11) not null,
primary key (`uid`)
) engine=innodb default charset=utf8";
$model->query($sql
);}
然後將乙個使用者id為[email protected] 通過以上行數進行格式化,得到乙個3個字串:1c8 ,然後將此使用者的資料存入user.user_1c8 資料表中,以後需要用到這個使用者的資料,只要進該使用者id也就是[email protected] 通過以上方法得到1c8 然後從資料表user.user_1c8 中查詢該使用者的資料即可。
MySQL分庫分表原理
在網際網路還未崛起的時代,我們的傳統應用都有這樣乙個特點 訪問量 資料量都比較小,單庫單錶都完全可以支撐整個業務。隨著網際網路的發展和使用者規模的迅速擴大,對系統的要求也越來越高。因此傳統的mysql單庫單錶架構的效能問題就暴露出來了。而有下面幾個因素會影響資料庫效能 為了提公升效能,所以我們必須要...
MySQL分庫分表原理
前言 在網際網路還未崛起的時代,我們的傳統應用都有這樣乙個特點 訪問量 資料量都比較小,單庫單錶都完全可以支撐整個業務。隨著網際網路的發展和使用者規模的迅速擴大,對系統的要求也越來越高。因此傳統的mysql單庫單錶架構的效能問題就暴露出來了。而有下面幾個因素會影響資料庫效能 為了提公升效能,所以我們...
Mycat分庫分表原理
1 什麼是mycat mycat是乙個開源的分布式資料庫系統,是乙個實現了mysql協議的伺服器,前端使用者可以把它看作是乙個資料庫 用mysql客戶端工具和命令列訪問,而其後端可以用mysql原生協議與多個mysql伺服器通訊,也可以用jdbc協議與大多數主流資料庫伺服器通訊,其核心功能是分表分庫...