SQLServer / MySQL 自增長 ID 一般用的數據類型是 INT 或 BIGINT,正常情況下這兩種類型可以滿足大多數應用的需求。當然也有不正常的情況,當達到其最大值時,嘗試插入新的記錄會導致錯誤,錯誤信息類似于:ERROR 167 (22003): Out of range value for column 'id' at row 1
下面我們就來看看 INT 或 BIGINT 到底能插入多少的數據。
INT 類型占用 4 個字節,范圍:-2,147,483,648 到 2,147,483,647(如果是無符號類型,則范圍是 0 到 4,294,967,295)也就是說 INT 類型存儲量將近可以達到 43 億,看著數量,感覺可以存儲很多條記錄了,我們就來計算下:一年 365 天,一天 24 小時,一小時 60 分鐘,一分鐘 60 秒,如果每秒鐘存儲 100 條記錄看看能用多久:# INT 的最大值
max_int_value = 4294967295
# 每秒記錄數
records_per_second = 100
# 每年的秒數
records_per_year = 365 * 24 * 60 * 60
result = max_int_value/(records_per_second * records_per_year)
print(result)
# 結果:1.3619251950152207
結果就為 1.3619251950152207,也就是能存儲 1 年多的時間,看來確實不太夠,使用 INT 類型,如果數據量過多,自增 ID 很容易超過最大數值。
BIGINT 占用 8 個字節,范圍:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(如果是無符號類型,則范圍是 0 到 18,446,744,073,709,551,615)假如公司是我家,我準備在公司呆個 100 年,我們來計算下 BIGINT 使用 100 年支持每秒插入多少數據。
BIGINT 類型的最大值:
無符號 BIGINT 類型的最大值為18,446,744,073,709,551,615。
100年×365天/年×24小時/天×60分鐘/小時×60秒/分鐘 = 3,153,600,000# BIGINT 的最大值
max_bigint = 18446744073709551615
# 100年的秒數
seconds_in_100_years = 365*24*60*60*100
# 計算結果
result = max_bigint / seconds_in_100_years
print(result)
# 結果:5849424173.55072
結果為 5849424173.55072 相當于每秒鐘插入 58 億的數據,這樣的數據雙十一都不知道有沒達到,我用 AI 查找了下淘寶雙十一歷史的最大并發生:這樣看,我如果使用 ,在公司干個 100 年完全沒問題,即便公司能活 100 年,老板也活不過 120+(假設老板 20 歲出來繼承家業),也就是即便我把老板送走,都達不到最大的值。所以我們只要把自增 ID 設置為 BIGINT 類型,你根本就不用擔心自增 ID 會用完,而是要擔心公司能不能活的比 BIGINT 更長。總結:INT 類型在大多數情況下足夠使用,當需要更大的數值范圍時,可以考慮使用 BIGINT 類型。如果你的自增 ID 是 INT 類型,要修改 INT 為 BIGINT 可以使用 ALTER 命令:-- 創建表
CREATE TABLE orders (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
order_data VARCHAR(255)
);
-- 查看表結構
DESCRIBE orders;
-- 修改自增列的數據類型
ALTER TABLE orders MODIFY id BIGINT UNSIGNED AUTO_INCREMENT;
-- 再次查看表結構,確認修改
DESCRIBE orders;
注意事項
- 備份數據:在進行表結構修改之前,最好備份數據,以防止操作過程中出現意外情況。
- 鎖表:在修改表結構時,表可能會被鎖定,導致短暫的寫操作中斷。盡量在業務低峰期進行操作。
- 外鍵約束:如果有外鍵約束涉及到要修改的列,需要先刪除相關外鍵約束,修改列類型后再重新添加外鍵約束。
該文章在 2024/6/17 10:40:18 編輯過