mysql 主键长度_MySQL 数据库,主键为何不宜太长长长长长长长长?
回答星球水友提問:沈老師,我聽網(wǎng)上說,MySQL數(shù)據(jù)表,在數(shù)據(jù)量比較大的情況下,主鍵不宜過長,是不是這樣呢?這又是為什么呢?
這個(gè)問題嘛,不能一概而論:
(1)如果是InnoDB存儲(chǔ)引擎,主鍵不宜過長;
(2)如果是MyISAM存儲(chǔ)引擎,影響不大;?先舉個(gè)簡單的栗子說明一下前序知識(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)是這樣的:
(1)有單獨(dú)的區(qū)域存儲(chǔ)記錄(record);
(2)主鍵索引與普通索引結(jié)構(gòu)相同,都存儲(chǔ)記錄的指針(暫且理解為指針);
畫外音:
(1)主鍵索引與記錄不存儲(chǔ)在一起,因此它是非聚集索引(Unclustered Index);
(2)MyISAM可以沒有PK;?MyISAM使用索引進(jìn)行檢索時(shí),會(huì)先從索引樹定位到記錄指針,再通過記錄指針定位到具體的記錄。
畫外音:不管主鍵索引,還普通索引,過程相同。InnoDB則不同,其索引與記錄的結(jié)構(gòu)是這樣的:
(1)主鍵索引與記錄存儲(chǔ)在一起;
(2)普通索引存儲(chǔ)主鍵(這下不是指針了);
畫外音:
(1)主鍵索引與記錄存儲(chǔ)在一起,所以才叫聚集索引(Clustered Index);
(2)InnoDB一定會(huì)有聚集索引;?InnoDB通過主鍵索引查詢時(shí),能夠直接定位到行記錄。
但如果通過普通索引查詢時(shí),會(huì)先查詢出主鍵,再從主鍵索引上二次遍歷索引樹。
回歸正題,為什么InnoDB的主鍵不宜過長呢?
假設(shè)有一個(gè)用戶中心場(chǎng)景,包含身份證號(hào),身份證MD5,姓名,出生年月等業(yè)務(wù)屬性,這些屬性上均有查詢需求。
最容易想到的設(shè)計(jì)方式是:
身份證作為主鍵
其他屬性上建立索引
user(id_code PK,
id_md5(index),
name(index),
birthday(index));
此時(shí)的索引樹與行記錄結(jié)構(gòu)如上:
id_code聚集索引,關(guān)聯(lián)行記錄
其他索引,存儲(chǔ)id_code屬性值
身份證號(hào)id_code是一個(gè)比較長的字符串,每個(gè)索引都存儲(chǔ)這個(gè)值,在數(shù)據(jù)量大,內(nèi)存珍貴的情況下,MySQL有限的緩沖區(qū),存儲(chǔ)的索引與數(shù)據(jù)會(huì)減少,磁盤IO的概率會(huì)增加。畫外音:同時(shí),索引占用的磁盤空間也會(huì)增加。?此時(shí),應(yīng)該新增一個(gè)無業(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));
如此一來,有限的緩沖區(qū),能夠緩沖更多的索引與行數(shù)據(jù),磁盤IO的頻率會(huì)降低,整體性能會(huì)增加。?總結(jié)(1)MyISAM的索引與數(shù)據(jù)分開存儲(chǔ),索引葉子存儲(chǔ)指針,主鍵索引與普通索引無太大區(qū)別;(2)InnoDB的聚集索引和數(shù)據(jù)行統(tǒng)一存儲(chǔ),聚集索引存儲(chǔ)數(shù)據(jù)行本身,普通索引存儲(chǔ)主鍵;(3)InnoDB不建議使用太長字段作為PK(此時(shí)可以加入一個(gè)自增鍵PK),MyISAM則無所謂;
希望解答了這位水友的疑問。
本文由 58沈劍 發(fā)布在 ITPUB,轉(zhuǎn)載此文請(qǐng)保持文章完整性,并請(qǐng)附上文章來源(ITPUB)及本頁鏈接。
原文鏈接:http://www.itpub.net/2019/10/02/3310/
總結(jié)
以上是生活随笔為你收集整理的mysql 主键长度_MySQL 数据库,主键为何不宜太长长长长长长长长?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python open ascii co
- 下一篇: oracle主从表分离怎么实时更新数据_