使用者表分表原理

2021-08-28 08:20:02 字數 1296 閱讀 1000

當使用者數量達到百萬甚至千萬級別的時候,可能無法靠單標滿足現有需求。此時常用的處理方式就是分庫分表。這裡介紹乙個簡單的分表方法。

對使用者進行分表,首先要解決的是將乙個使用者分配到那個表,然後如何知道去哪個表查詢該使用者的資料。解決了這個兩個問題。無論將該使用者的資料放在哪個表都無所謂。

首先來看乙個方法:

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協議與大多數主流資料庫伺服器通訊,其核心功能是分表分庫...