国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

數據庫性能優化技巧之:變長表、定長表

2024-07-24 12:56:03
字體:
來源:轉載
供稿:網友

什么是定長表和變長表?
包含任何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';

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 文化| 张北县| 隆化县| 乌拉特中旗| 古浪县| 饶平县| 兰坪| 海林市| 海晏县| 漯河市| 盐源县| 申扎县| 蒙山县| 田阳县| 东至县| 菏泽市| 昌吉市| 林州市| 太白县| 昆明市| 道真| 江门市| 阜康市| 车致| 曲水县| 南昌县| 浙江省| 灵丘县| 紫云| 神农架林区| 鸡西市| 上栗县| 东丰县| 迭部县| 瑞昌市| 宜章县| 黎平县| 合江县| 梅州市| 合山市| 萝北县|