如题,设计一张表,id这种自增字段该怎么选择类型?
光阴似箭催人老,日月如移越少年。
用自增的整數。
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT
id一般來說不會是負數,所以用UNSIGNED。 id一般来说不会是负数,所以用UNSIGNED。 id相当于身份证,不应该也不能是NULL。 至于为什么是整数,和两个因素有关:
id
UNSIGNED
占用空间。
效率。
MySQL的AUTO_INCREMENT不支持字符型。占用空间不用多说, INT类型固定只占用4个字节,能表示的范围达到了-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647) ,设为非负之后翻倍,而使用字符串想要表示这么大量的数据...
AUTO_INCREMENT
INT
4个字节
-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)
效率则和索引的结构有关,MySQL使用B+树作为索引的数据结构,如果使用自增整数的话,插入数据时最多只会引起节点的分裂,而使用字符串则有可能会插入到任何地方,这意味着可能会引起节点的移动和分裂id相當於身分證,不應該也不能是NULL。
B+树
分裂
移动和分裂
4個位元組
-2^31 (-2,147,483,648) 到2 ^31 – 1 (2,147,483,647)
B+樹
分割
移動和分裂
數字型方便索引
用自增的整數。
id
一般來說不會是負數,所以用UNSIGNED
。id
一般来说不会是负数,所以用UNSIGNED
。id
相当于身份证,不应该也不能是NULL。至于为什么是整数,和两个因素有关:
占用空间。
效率。
MySQL的
AUTO_INCREMENT
不支持字符型。占用空间不用多说,
INT
类型固定只占用4个字节
,能表示的范围达到了-2^31 (-2,147,483,648) 到 2^31 – 1 (2,147,483,647)
,设为非负之后翻倍,而使用字符串想要表示这么大量的数据...效率则和索引的结构有关,MySQL使用
至於為什麼是整數,和兩個因素有關:B+树
作为索引的数据结构,如果使用自增整数的话,插入数据时最多只会引起节点的分裂
,而使用字符串则有可能会插入到任何地方,这意味着可能会引起节点的移动和分裂
id
相當於身分證,不應該也不能是NULL。佔用空間。
效率。
AUTO_INCREMENT
不支援字元型。 🎜佔用空間不用多說,INT
類型固定只佔用4個位元組
,能表示的範圍達到了-2^31 (-2,147,483,648) 到2 ^31 – 1 (2,147,483,647)
,設為非負之後翻倍,而使用字串想要表示這麼大量的資料...🎜B+樹
作為索引的資料結構,如果使用自增整數的話,插入資料時最多只會引起節點的分割
,而使用字串則有可能會插入到任何地方,這意味著可能會引起節點的移動和分裂
。其次是在資料查詢的時候,字串的比較也要比整數的比較慢。 🎜 🎜更多資訊可以參考這個: 🎜自增主鍵是否會降低資料庫insert效能?如果會的話為什麼還有很多公司採用? 🎜 🎜最後: 我支持主鍵與具體資料無關= =.. 所以用整數最為主鍵是比較不錯的選擇。 🎜數字型方便索引