數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?-創(chuàng)新互聯(lián)

回答星球水友提問(wèn):

創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),謝通門網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:謝通門等地區(qū)。謝通門做網(wǎng)站價(jià)格咨詢:13518219792沈老師,我聽(tīng)網(wǎng)上說(shuō),MySQL數(shù)據(jù)表,在數(shù)據(jù)量比較大的情況下,主鍵不宜過(guò)長(zhǎng),是不是這樣呢?這又是為什么呢? 這個(gè)問(wèn)題嘛,不能一概而論:(1)如果是InnoDB存儲(chǔ)引擎,主鍵不宜過(guò)長(zhǎng);(2)如果是MyISAM存儲(chǔ)引擎,影響不大; 先舉個(gè)簡(jiǎn)單的栗子說(shuō)明一下前序知識(shí)。 假設(shè)有數(shù)據(jù)表:

t(id PK, name KEY, sex, flag);

 其中:(1)id是主鍵;(2)name建了普通索引; 假設(shè)表中有四條記錄:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

 如果存儲(chǔ)引擎是MyISAM,其索引與記錄的結(jié)構(gòu)是這樣的:

數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?

(1)有單獨(dú)的區(qū)域存儲(chǔ)記錄(record);(2)主鍵索引與普通索引結(jié)構(gòu)相同,都存儲(chǔ)記錄的指針(暫且理解為指針);畫外音:(1)主鍵索引與記錄不存儲(chǔ)在一起,因此它是非聚集索引(Unclustered Index);(2)MyISAM可以沒(méi)有PK; MyISAM使用索引進(jìn)行檢索時(shí),會(huì)先從索引樹定位到記錄指針,再通過(guò)記錄指針定位到具體的記錄。畫外音:不管主鍵索引,還普通索引,過(guò)程相同。 InnoDB則不同,其索引與記錄的結(jié)構(gòu)是這樣的:

數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?

(1)主鍵索引與記錄存儲(chǔ)在一起;(2)普通索引存儲(chǔ)主鍵(這下不是指針了);畫外音:(1)主鍵索引與記錄存儲(chǔ)在一起,所以才叫聚集索引(Clustered Index);(2)InnoDB一定會(huì)有聚集索引; InnoDB通過(guò)主鍵索引查詢時(shí),能夠直接定位到行記錄。 

數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?

但如果通過(guò)普通索引查詢時(shí),會(huì)先查詢出主鍵,再?gòu)闹麈I索引上二次遍歷索引樹。 回歸正題,為什么InnoDB的主鍵不宜過(guò)長(zhǎng)呢? 假設(shè)有一個(gè)用戶中心場(chǎng)景,包含身份證號(hào),身份證MD5,姓名,出生年月等業(yè)務(wù)屬性,這些屬性上均有查詢需求。

最容易想到的設(shè)計(jì)方式是:
  • 身份證作為主鍵

  • 其他屬性上建立索引

user(id_code PK,
id_md5(index),
name(index),
birthday(index));

 

數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?

此時(shí)的索引樹與行記錄結(jié)構(gòu)如上:
  • id_code聚集索引,關(guān)聯(lián)行記錄

  • 其他索引,存儲(chǔ)id_code屬性值

 身份證號(hào)id_code是一個(gè)比較長(zhǎng)的字符串,每個(gè)索引都存儲(chǔ)這個(gè)值,在數(shù)據(jù)量大,內(nèi)存珍貴的情況下,MySQL有限的緩沖區(qū),存儲(chǔ)的索引與數(shù)據(jù)會(huì)減少,磁盤IO的概率會(huì)增加。畫外音:同時(shí),索引占用的磁盤空間也會(huì)增加。 此時(shí),應(yīng)該新增一個(gè)無(wú)業(yè)務(wù)含義的id自增列:
  • 以id自增列為聚集索引,關(guān)聯(lián)行記錄

  • 其他索引,存儲(chǔ)id值

user(id PK auto inc,
id_code(index),
id_md5(index),
name(index),
birthday(index));

 

數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?

如此一來(lái),有限的緩沖區(qū),能夠緩沖更多的索引與行數(shù)據(jù),磁盤IO的頻率會(huì)降低,整體性能會(huì)增加。 總結(jié)(1)MyISAM的索引與數(shù)據(jù)分開存儲(chǔ),索引葉子存儲(chǔ)指針,主鍵索引與普通索引無(wú)太大區(qū)別;(2)InnoDB的聚集索引和數(shù)據(jù)行統(tǒng)一存儲(chǔ),聚集索引存儲(chǔ)數(shù)據(jù)行本身,普通索引存儲(chǔ)主鍵;(3)InnoDB不建議使用太長(zhǎng)字段作為PK(此時(shí)可以加入一個(gè)自增鍵PK),MyISAM則無(wú)所謂;

希望解答了這位水友的疑問(wèn)。

分享題目:數(shù)據(jù)庫(kù),主鍵為何不宜太長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)長(zhǎng)?-創(chuàng)新互聯(lián)
文章來(lái)源:http://muchs.cn/article30/dhgopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站網(wǎng)站維護(hù)、用戶體驗(yàn)、響應(yīng)式網(wǎng)站、小程序開發(fā)、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管