欧美麻豆久久久久久中文_成年免费观看_男人天堂亚洲成人_中国一级片_动漫黄网站免费永久在线观看_国产精品自产av一区二区三区

中培偉業IT資訊頻道
您現在的位置:首頁 > IT資訊 > 數據庫 > 數據庫水平切分的方法有哪些?數據庫字段設計方法有哪些?

數據庫水平切分的方法有哪些?數據庫字段設計方法有哪些?

2020-10-14 17:07:38 | 來源:中培企業IT培訓網

眾所鄒知,數據庫的無論是在設計過程中,還是在使用過程中,都存在一些小技巧和方法。因此,經常使用數據庫的人都會總結這些方法。本文要總結的方法是:數據庫水平切分的方法有哪些?數據庫字段設計方法有哪些?關于數據庫水平切分的方法有兩個,而對于數據庫字段的設計方法這里總結了12點,下文是詳解。

  數據庫水平切分的方法有哪些?

  方法一:使用MD5哈希

做法是對UID進行md5加密,然后取前幾位(我們這里取前兩位),然后就可以將不同的UID哈希到不同的用戶表(user_xx)中了。

function getTable( $uid ){

$ext = substr ( md5($uid) ,0 ,2 );

return "user_".$ext;

}

通過這個技巧,我們可以將不同的UID分散到256中用戶表中,分別是user_00,user_01 ...... user_ff。因為UID是數字且遞增,根據md5的算法,可以將用戶數據幾乎很均勻的分別到不同的user表中。

但是這里有個問題是,如果我們的系統的用戶越來越多,勢必單張表的數據量越來越大,而且根據這種算法無法擴展表,這又會回到文章開頭出現的問題了。

方法二:使用移位

具體方法是:

public function getTable( $uid ) {

return "user_" . sprintf( "%04d", ($uid >> 20) );

}

這里,我們將uid向右移動20位,這樣我們就可以把大約前100萬的用戶數據放在第一個表user_0000,第二個100萬的用戶數據放在第二個表user_0001中,這樣一直下去,如果我們的用戶越來越多,直接添加用戶表就行了。由于我們保留的表后綴是四位,這里我們可以添加1萬張用戶表,即user_0000,user_0001 ...... user_9999。一萬張表,每張表100萬數據,我們可以存100億條用戶記錄。當然,如果你的用戶數據比這還多,也不要緊,你只要改變保留表后綴來增加可以擴展的表就行了,如如果有1000億條數據,每個表存100萬,那么你需要10萬張表,我們只要保留表后綴為6位即可。

上面的算法還可以寫的靈活點:

/**

* 根據UID分表算法

*

* @param int $uid //用戶ID

* @param int $bit //表后綴保留幾位

* @param int $seed //向右移動位數

*/

function getTable( $uid , $bit , $seed ){

return "user_" . sprintf( "%0{$bit}d" , ($uid >> $seed) );

}

上面兩種方法,都要對我們當前系統的用戶數據量做出可能最大的預估,并且對數據庫單個表的最大承受量做出預估。

比如第二種方案,如果我們預估我們系統的用戶是100億,單張表的最優數據量是100萬,那么我們就需要將UID移動20來確保每個表是100萬的數據,保留用戶表(user_xxxx)四位來擴展1萬張表。

又如第一種方案,每張表100萬,md5后取前兩位,就只能有256張表了,系統總數據庫就是:256*100萬;如果你系統的總數據量的比這還多,那你實現肯定要MD5取前三位或者四位甚至更多位了。

兩種方法都是將數據水平切分到不同的表中,相對第一種方法,第二種方法更具擴展性。

  數據庫字段設計方法有哪些?

1. tinyint 是-128到128 。當屬性設置為unsigned的時候。最大值就是255了。現在知道為什么需要設置為unsigned屬性了。原來是為了最大限度的使用給予的存儲空間。如果不設置。那么假如你的值都是正數的。那么-128這一百多個數字就相當于是浪費了。

2. tinyint會自動設置為tinyint(3)。

3. smallint 不設置unsigned的時候,也有3萬多的樣子。

4. tinytext 就是255個字節。大概就是存儲127個中文的樣子 tinytext就相當于varchar類型。把它看成這樣的該類型就容易理解了。

5. int 類型phpmyadmin默認會設置int(10)。

6. 概念糾正:原來一直以為這里的10表示位數。直到有次想保存1101061021496,結果在字段中的值都變成了:4294967295。 看MySQL手冊上說:

(int后面括號的數字)顯示寬度并不限制可以在列內保存的值的范圍,也不限制超過列的指定寬度的值的顯示。

7. int的范圍:-2147483648到2147483647。剛好是10個位,那么就是數十億級別的數字。數據庫設計經驗:像訂單的值非常大。不確定,如果達到10位數,還不如使用varchar類型。fangwei就沒有使用int,而是varchar類型。

8. 從上面也告訴我一個經驗:如果保存在數據庫的值都變成一樣的。也就是無論我是1101061021496 還是1101061021569,結果都變成了固定的值,比如4294967295。那么可以考慮確認是否是數據庫該字段的范圍問題。這樣的問題出現過好幾次了。就是沒有掌握思路。導致浪費了不少時間。

9. 將字段設置為not null 還出于另外一種考慮:mysql表的列中包含null的話,那么該列不會包含在所有中。也就是使用索引是無效的。所有,考慮今后會使用索引的字段,就要設置字段屬性是not null。

10. 如果你要保存NULL,手動去設置它,而不是把它設為默認值。

11. 考慮到這個字段今后會作為查詢關鍵字使用like的形式進行搜索。那么要將該字段定義成索引。這樣使用like查詢就會更快。

12. 現在終于體會到到國外作者書籍上提到:設計數據庫之前要問自己,之后會查詢哪些數據。 考慮了這些,以后有什么查詢需要。結構都能適應了。

上述就是關于數據庫水平切分的方法有哪些,以及數據庫字段設計方法有哪些的全部內容,想了解更多關于數據庫的信息,請繼續關注中培偉業。

主站蜘蛛池模板: 粉嫩av一区二区在线观看 | 男男自慰GAY片免费观看 | 乱色熟女综合一区二区三区 | 日产乱码一二三区别免费一 | 国产精品久久人妻无码网站一丁 | 黄色激情视频网站 | 综合久久av | 午夜福利国产成人无码 | 国产精品 亚洲 无码 在线 | 免费看国产精品3A黄的视频 | 亚洲综合欧美色五月俺也去 | 未满十八18禁止午夜免费网站 | 亚洲成a人片在线观看天堂无码 | 东京一本一道一二三区 | 亚洲国产福利成人一区二区 | 强奷漂亮少妇高潮在线观看 | 成年无码av片| 大尺度露器官的三级 | 亚洲成a∧人片在线播放 | 成人午夜无码精品免费看 | 美女午夜福利4K视频在线观看 | 秋霞鲁丝片av无码 | 欧洲美女粗暴牲交视频免费 | 亚洲乱码中文字幕小综合 | 国产成人A在线观看网站站 亚洲日韩中文第一精品 | 毛片b | 91老司机免费精品观看 | 伦埋琪琪深夜福利 | 国产乱子影视频上线免费观看 | 亚洲中文在线精品国产 | 窝窝人体色www | 婷婷五月日韩AV永久免费 | 日本在线A一区视频高清视频 | 三年片中国在线观看免费大全 | 久久久99无码一区 | 特级毛片在线大全免费播放 | 台湾无码AV一区二区三区 | 国产精品无打码在线播放 | 老熟仑妇乱视频一区二区 | 国产精品爆乳奶水无码视频免费 | 少妇愉情理伦片 |