什么是定長表和變長表?
包含任何varchar、text等變長字段的數據表,即為變長表,反之則為定長表。
表設計思路:
在設計表結構時如果能夠使用定長數據類型盡量用定長的,因為定長表的查詢、檢索、更新速度都很快。必要時可以把部分關鍵的、承擔頻繁訪問的表拆分,例如定長數據一個表,非定長數據一個表。因此規劃數據結構時需要進行全局考慮;進行表結構設計時,應當做到恰到好處,反復推敲,從而實現最優的數據存儲體系。
定長表、變長表各自的優缺點:
A.對于變長表,由于記錄大小不同,在其上進行許多刪除和更改將會使表中的碎片更多。需要定期運行OPTIMIZE TABLE以保持性能。而定長表就沒有這個問題;
B.如果表中有可變長的字段,將它們轉換為定長字段能夠改進性能,因為定長記錄易于處理。但在試圖這樣做之前,應該考慮下列問題:
C.使用定長列涉及某種折衷。它們更快,但占用的空間更多。char(n) 類型列的每個值總要占用n 個字節(即使空串也是如此),因為在表中存儲時,值的長度不夠將在右邊補空格;
D.而varchar(n)類型的列所占空間較少,因為只給它們分配存儲每個值所需要的空間,每個值再加一個字節用于記錄其長度。因此,如果在char和varchar類型之間進行選擇,需要對時間與空間作出折衷;
E.有時不能使用定長類型,即使想這樣做也不行。例如對于比255字符更長的串,沒有定長類型。
舉例說明:
例如您需要有一個存儲用戶登錄信息和其他資料的表。需要有以下域:
uid, username, password, gender(性別), regdate(注冊時間), nickname(昵稱), site(個人網站地址), address(地址)
從域的內容分析,以下域長度都會在255以下,而且長度相對穩定,那就將其分離出來,建做一個定長表:mysite_user,結構如下:
CREATE TABLE `mysite_user` (
`uid` mediumint(8) unsigned NOT NULL auto_increment,
`username` char(15) NOT NULL default '',
`password` char(32) NOT NULL default '',
`gender` tinyint(1) NOT NULL default '0',
`regdate` int(10) unsigned NOT NULL default '0',
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`)
) ENGINE=MyISAM;
然后將其他長度無法預料、并且有可能超過255長度的域建做另外一個表:mysite_userprofile,這是一個變長表。結構如下:
CREATE TABLE `mysite_userprofile` (
`uid` mediumint(8) unsigned NOT NULL default '0',
`nickname` varchar(30) NOT NULL default '',
`site` varchar(75) NOT NULL default '',
`address` varchar(512) NOT NULL default '',
PRIMARY KEY (`uid`)
) ENGINE=MyISAM;
用戶登錄驗證查詢是非常頻繁的,當用戶數多了以后,表的設計更加影響查詢速度。用戶登錄的時候只查詢mysite_user表,按照我們的設計這個表是定長,所以一定程度會加快查詢速度。
而在需要調用用戶全部信息的時候,可以用左連接將兩個表的數據拼在一起,這樣就和沒分表一樣使用了。例如:
SELECT u.*, up.* FROM mysite_user AS u
LEFT JOIN mysite_userprofile AS up ON up.uid=u.uid
WHERE u.uid='888';
新聞熱點
疑難解答