2012-02-23 13 views
8

我知道2,4,8,16,32,64,128,256 ...是二進制數字的十進制等值。爲什麼數據庫模式通常包含32,64,128等

這是爲什麼在數據庫中使用的原因嗎?例如,VARCHAR字段的長度通常爲255個字符。由於(我假設)每個字符都是一個字節,爲什麼使用255個字符和使用257個字符有區別?

回答

4

隨着varchar列,則長度存儲使用無符號整數在數據的前導字節的數據。使用最少的字節數;一個字節可以存儲0到255之間的長度,0到65535之間的兩個字節等。通過使長度爲255,可以從最小長度字節中獲得「最大值」。

在過去的日子裏,每行保存的單個字節的磁盤值得保存。儘管現在磁盤價格便宜,但這種想法一直存在,特別是灰色頭髮的DBA。

選擇長度爲2的冪沒有優勢,例如varchar(64) - 這僅僅是一種習慣/習慣(我甚至會遵循它 - 我不知道爲什麼!)。

+0

Ouch。我有灰白的頭髮,但我不那麼古老(38)。 :-) – 2012-02-23 03:46:31

+0

嗯,雖然在大型表中,你需要使SELECT調用需要大量的I/O,節省幾個字節的行大小*可以有所作爲。 (但是你對VARCHAR的長度做了絕對正確的判斷:) – osman 2016-02-15 22:57:56

+1

@osman yes - 你可以放入1頁磁盤的行和/或索引條目越多,性能就越好。 – Bohemian 2016-02-16 00:11:23

1

不僅僅是數據庫模式,但幾乎所有的編程工件都會被發現包含許多形式爲2^N或2^N-1的數字。儘管其中一些用途是有意義的(例如,在許多機器體系結構中,2^32-1是可表示爲最大數字的一個標準無符號整數),但大多數2的冪的使用是不太必要的。在實踐中,老黑客認爲2的權力是聖潔的,並且崇敬他們。

+0

當您查看數據的十六進制轉儲時,事情會如何順利排列? ;-) – mpontillo 2012-02-23 03:40:42

1

數據庫中的數據通常以pages的格式組織。這些頁面幾乎與存儲器和緩存管理的內存邊界通用。爲您的數據選擇2^n的大小對於優化數據庫中空間的使用是很好的。

注意:根據RDBMS引擎的不同,從內存對齊角度來看,256可能不是最佳選擇,因爲字符串的長度也佔用空間,即varchar(256)佔用258個字節。

+0

除非數據大小是固定的(char/nchar),否則這對於變長列來說並不適用,這些列更有可能使用這些幻數來定義,而且這些列很少被完全填充,因此也不會均勻地填充在一個漂亮的小塊頁面。 – 2012-02-23 03:45:40

+0

@AaronBertrand這就是我在答案結尾處的註釋中所做的要點:對於'varchar'列,2^n個數字不太可能有助於頁面對齊。 – dasblinkenlight 2012-02-23 03:50:44

+0

對不起,我在完成第一段後開始發表評論。建議說一些關於「固定數據」的內容,而不是「數據」,以防其他人也不讀你的筆記。 :-) – 2012-02-23 03:52:44

1

這比什麼都更習慣。關於varchar(32)或varchar(64)沒有什麼魔力,類似的,對於可視化工具嘗試讓你使用的默認值(例如varchar(50))沒有什麼魔力。很多這些上限已經深入人心,因爲640k對於任何人都是足夠的內存,我們真的需要擔心每個字節。

在很多情況下,它歸結爲一個共同點。在以前的系統中,我在產品經理工作時不知道他們的要求是什麼。他們想存儲一個名字,但是他們不知道域名真的包含了什麼 - 但是其中一個人說他們聽說過一個姓> 50個字符,所以他知道它必須超過32個,超過了50個。我們回來了64,他同意這已經足夠了,那就是今天仍然有AFAIK。

儘管我們確實有電子郵件的技術原因(varchar(320)),當時標準規定爲320個字符,因爲用戶名/本地部分爲64個字符,域名爲255個字符, @。大多數其他決策都基於優先級(例如,所有後續名稱都遵循上面決定的nvarchar(64)模型),或者邏輯(例如,URL不需要是nvarchar(max),但取決於標準和瀏覽器功能時間,他們是我相信varchar(2048)或varchar(4096)。在這種情況下,不是因爲它是2的冪,而是因爲別人的軟件或標準建立他們的東西使用2的冪。

+0

+1因爲你(我認爲)建議諮詢標準,例如爲人姓氏我會使用'VARCHAR(35)'來匹配[我的國家的政府數據標準](http://interim.cabinetoffice.gov.uk/govtalk/schemasstandards/e-gif/datastandards/person_information/person_name/部分原因是我的軟件可能與政府數據庫進行交互,但也是因爲有人已經做了分析,以確定35個非Unicode字符是合理的約束,所以我不必! – onedaywhen 2012-02-23 08:42:40

+0

是的,絕對的,如果你的行業有數據標準,你應該使用它們。但是你的客戶和產品經理 - 誰也是你的客戶 - 可能經常以其他方式指示,而他們的王牌通常會擊敗標準的王牌(除非他們愚蠢或荒謬)。他們會測試你是否真的允許使用64位姓氏,相信我。 :-) – 2012-02-23 12:55:51

+0

我想知道,如果有人建議使用'NVARCHAR'而不是'VARCHAR',那麼我將有理由將[從Joe Celko的書中抽出一頁](http://books.google.co.uk/books ?ID = a9jtyioHfp8C&PG = PA131與LPG = PA131&DQ = celko +佛教與源= BL&OTS = Py_oNKC6_h與SIG = d9MRYEcVlI-Noi03XWLaDhAv6WM&HL = EN&SA = X&EI = D0VGT6SzAYbN0QXa7KmmDg&VED = 0CCAQ6AEwAA#v = onepage&q&F = FALSE),並把中國的Unicode在那裏? ;) – onedaywhen 2012-02-23 14:08:47

相關問題