分表,分庫演算法

2022-04-03 17:08:47 字數 1572 閱讀 8963

經典案例:

1:在memcache中分key儲存。主機分布式選擇主機的演算法

一:利用crc32雜湊

<?php

//範圍:00-63

function crc_hash(&$keyword,$n=64)

?>

二:當使用者數量太多(如達到千萬級別),數量量太大時,我們會根據使用者名稱username使用hash演算法得出0-n的乙個數值,將使用者資訊分散儲存到n個表中,如增加使用者資訊示例**如下:

<?php

function gethash(&$keyword,$n)

$table = 'userinfo_'.gethash($username,100);

$sql = "insert into values(....)";

$db = new models($table);//封裝的資料庫操作類

$db->myinsert($sql);

?>

三:hash演算法一般是利用陣列實現的,步驟如下:

存元素時:

1.把要儲存的元素(value)計算乙個hashcode(稱為雜湊),這個就是key。

2.把元素儲存到以hashcode為下標的陣列中。

3.若此陣列下標已經有元素,則使用鍊錶的方式把元素連線起來。

獲得元素時:

1.元素(value)計算hashcode。

2.hash表中按hashcode(key)取得元素。

3.若乙個key中對應多個元素,則還需匹配是哪個元素。

就這麼簡單,hash演算法由於直接對映陣列下標,所以查詢演算法的時間複雜度來說是o(1)的。不過若計算hashcode的演算法不是很好的話,可能

造成乙個桶(陣列中的乙個位置)內有多個元素,而有些桶內乙個元素都沒有。這樣在存、取元素時都需要在桶內進行查詢操作,而且造成空間的浪費。所以乙個好的hashcode的演算法使得任意給定的元素能夠均勻地儲存在hash表中的每個桶內,顯得尤為重要。以下給出乙個非常經典的通用雜湊演算法,經過研究人員統計分析過雜湊程度的。

unsigned long hashcode(const unsigned char *name)

return h;

}

除非你對這個通用雜湊演算法有特殊需求,導致無法滿足需要,否則應該使用這個函式。

hash演算法確實應用得非常廣泛,因為其查詢的速度是o(1)的。比如:如今資料的海量訪問和高併發訪問的需求,造成關聯式資料庫逐漸退出舞台。db中使用b+樹索引提供範圍查詢,hash(key-value)索引實現點查詢。

例子:在開發中,整型的數值可以通過取模(mod)來進行分表,但是,對於帳號這種字串型別,卻不能實現。怎麼辦呢,我們可以通過crc32這個函式來分表,函式如下:

function account_hash($account,$tail=4,$mod=1)

使用這個函式,可以靈活定義分表的離散程度和分表數量

參考:<?

php//範圍:00-63

function

crc_hash

(&$keyword,$n

=64)?>

mysql分表分庫實現 MySql分表分庫思路

一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...

MySQL範圍分表分庫 mysql 分表分庫策略

唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...

mysql 分庫分表實戰 MySQL分庫分表實戰

為什麼要分庫分表 在大型 中,當使用者量以及使用者產生的業務資料量達到單庫單錶效能極限時,為了支撐業務可持續發展,對於重要的核心業務必然要進行分庫分表來儲存業務資料。對於非核心業務產生的大量資料,例如爬蟲爬取的資訊,論壇產生的資料等,可以考慮把資料儲存在像mongodb這樣的nosql儲存裡面,這些...