自增ID有什么坏处?什么样的场景下不使用自增ID?
這里是修真院后端小課堂,每篇分享文從
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】
八個方面深度解析后端知識/技能,本篇分享的是:
【自增ID有什么壞處?什么樣的場景下不使用自增ID?】
?
1.背景介紹
在MySQL中,數據表的主鍵一般采用id字段自增的形式。使用自增ID給我們帶來不少便捷,但也有不少壞處。
2.知識剖析
2.1什么是自增ID(MySQL數據庫)
自增ID是在設計表時如果將id字段的值設置為自增的形式也就是AUTO_INCREMENT,
那么當插入一行數據時就無需指定id,數據表會根據前一個id值+1進行填充。
指定了AUTO_INCREMENT的列必須要建索引,一般把ID作為主鍵,這樣系統會自動為ID建立索引。
2.2自增ID有什么好處?
(1) 增加記錄時,可以不用指定id字段,不用擔心主鍵重復問題。
(2)數據庫自動編號,速度快,而且是增量增長,按順序存放,對于檢索非常有利;
(3)數字型,占用空間小,易排序,在程序中傳遞也方便;
3.常見問題
自增ID有什么壞處?
(1) 不具有連續性,表中auto_increment最大值被刪除,將不會被重用。就是說會跳號(如果設定的auto_increment_increment是1,那么下一次插入的id值將會從被刪除的最大值算起,也就是被刪除的最大值+1)
(2)歷史數據表的主鍵id會與數據表的id重復,兩張自增id做主鍵的表合并時,id會有沖突,但如果各自的id還關聯了其他表,這就很不好操作。
(3) 很難處理分布式存儲的數據表,尤其是需要合并表的情況下
(4) 在系統集成或割接時,如果新舊系統主鍵不同是數字型就會導致修改主鍵數據類型,這也會導致其它有外鍵關聯的表的修改,后果同樣很嚴重;
4.解決方案
4.1自增ID的替代者UUID自增ID的替代者UUID
UUID是指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。
UUID的目的,是讓分布式系統中的所有元素,都能有唯一的辨識資訊,而不需要透過中央控制端來做辨識資訊的指定。如此一來,每個人都可以建立不與其它人沖突的UUID。在這樣的情況下,就不需考慮數據庫建立時的名稱重復問題。
4.2 UUID的優點
(1)能夠保證獨立性,程序可以在不同的數據庫間遷移,效果不受影響。
(2)保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分數據庫的時候尤為重要。
(3)安全性較高
4.3 UUID的缺點:
(1)uuid是無序的,這會嚴重影響到表的插入性能。
(2)uuid占的空間大
5.編碼實戰
?
6.擴展思考
由于本人正在學任務一,平時用到的是mysql的自增ID,所以對于自增ID的不具有連續性也是要有解決辦法的。
方法一:可以用insert 語句直接指定id插入語句
方法二:設置自增值 ALTER TABLE table_name AUTO_INCREMENT = 1;(數字1可以是由你自定義設置的自增值,table_name就是你要使用的數據表)
方法三:用truncate table table_name ;語句直接清空表數據并重置自增值(table_name就是你要使用的數據表)
7.參考文獻
CSDN、百度百科
8.更多討論
(1) UUID在MySQL中是以什么類型存放的呢?
在MySQL里保存UUID做主鍵,一般是使用char類型存放的。
(網上有說在PostgreSQL等一些數據庫里,都有專門的UUID類型,在這些數據庫里以UUID做主鍵,效率是沒問題的)
(2)有沒有辦法解決UUID在MySQL數據庫的效率慢的問題?
可以把UUID作為邏輯主鍵,物理主鍵依然使用自增ID。
(3)可以改變自增ID每次的自增量嗎?
auto_increment_offset表示自增長字段從哪個數開始。
auto_increment_increment表示自增長字段每次遞增的量,其默認值是1。
通過set命令修改,不需要重啟mysql,但是要重新打開命令行界面,一般需要用set global來設置(自定義等號后面的數字就可以了)
set global auto_increment_increment=2;
set global auto_increment_offset=2;
鳴謝:
感謝修真院的師兄和CSDN博客上相關的作者,此教程是在他們之前技術分享的基礎上完善而成。
結束語:
今天的分享就到這里啦,歡迎大家點贊、轉發、留言、拍磚~
?
PPT鏈接?視頻鏈接
總結
以上是生活随笔為你收集整理的自增ID有什么坏处?什么样的场景下不使用自增ID?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Bugku CRYPTO No Ciph
- 下一篇: [置顶]Ceph源码解析:PG peer