回答星球水友提問:
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供武岡網(wǎng)站建設(shè)、武岡做網(wǎng)站、武岡網(wǎng)站設(shè)計、武岡網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、武岡企業(yè)網(wǎng)站模板建站服務(wù),十年武岡做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
沈老師,我聽網(wǎng)上說,MySQL數(shù)據(jù)表,在數(shù)據(jù)量比較大的情況下,主鍵不宜過長,是不是這樣呢?這又是為什么呢?t(id PK, name KEY, sex, flag);
1, shenjian, m, A
3, zhangsan, m, A
5, lisi, m, A
9, wangwu, f, B
如果存儲引擎是MyISAM,其索引與記錄的結(jié)構(gòu)是這樣的:(1)有單獨的區(qū)域存儲記錄(record);(2)主鍵索引與普通索引結(jié)構(gòu)相同,都存儲記錄的指針(暫且理解為指針);(1)主鍵索引與記錄不存儲在一起,因此它是非聚集索引(Unclustered Index);MyISAM使用索引進(jìn)行檢索時,會先從索引樹定位到記錄指針,再通過記錄指針定位到具體的記錄。InnoDB則不同,其索引與記錄的結(jié)構(gòu)是這樣的:(1)主鍵索引與記錄存儲在一起,所以才叫聚集索引(Clustered Index);InnoDB通過主鍵索引查詢時,能夠直接定位到行記錄。但如果通過普通索引查詢時,會先查詢出主鍵,再從主鍵索引上二次遍歷索引樹。假設(shè)有一個用戶中心場景,包含身份證號,身份證MD5,姓名,出生年月等業(yè)務(wù)屬性,這些屬性上均有查詢需求。
最容易想到的設(shè)計方式是:user(id_code PK,
id_md5(index),
name(index),
birthday(index));
此時的索引樹與行記錄結(jié)構(gòu)如上:身份證號id_code是一個比較長的字符串,每個索引都存儲這個值,在數(shù)據(jù)量大,內(nèi)存珍貴的情況下,MySQL有限的緩沖區(qū),存儲的索引與數(shù)據(jù)會減少,磁盤IO的概率會增加。此時,應(yīng)該新增一個無業(yè)務(wù)含義的id自增列:user(id PK auto inc,
id_code(index),
id_md5(index),
name(index),
birthday(index));
如此一來,有限的緩沖區(qū),能夠緩沖更多的索引與行數(shù)據(jù),磁盤IO的頻率會降低,整體性能會增加。(1)MyISAM的索引與數(shù)據(jù)分開存儲,索引葉子存儲指針,主鍵索引與普通索引無太大區(qū)別;(2)InnoDB的聚集索引和數(shù)據(jù)行統(tǒng)一存儲,聚集索引存儲數(shù)據(jù)行本身,普通索引存儲主鍵;(3)InnoDB不建議使用太長字段作為PK(此時可以加入一個自增鍵PK),MyISAM則無所謂;
希望解答了這位水友的疑問。
當(dāng)前文章:數(shù)據(jù)庫,主鍵為何不宜太長長長長長長長長?
文章鏈接:
http://weahome.cn/article/gospcg.html