hibernate 复合主键 根据主键删除_Python 之 MySql“未解之谜”11--主键 id 那些事
主鍵 id 用自增和 uuid 有什么區(qū)別?
● uuid 有 16 個(gè)字節(jié),比 int(4 byte)和 bigint(8 byte)占用更多存儲(chǔ)空間
有大量數(shù)據(jù)的時(shí)候 uuid 主鍵不會(huì)像自增主鍵那樣越界,如果使用自增 id,字段類型一般選擇 bigint
● 如果 InnoDB 表的數(shù)據(jù)寫入順序能和 B + 樹索引的葉子節(jié)點(diǎn)順序一致的話,這時(shí)候存取效率是最高的,uuid 由于無序性,插入和查詢比自增主鍵差
● uuid 做主鍵相對(duì)安全,不能簡(jiǎn)單的從 uuid 獲取信息,但是如果自增,則容易暴露信息,如果一個(gè)客戶 id 是 123456,很容易猜到有客戶 id 是 123456
● uuid 保證數(shù)據(jù)在表和庫(kù)都是獨(dú)立的,有利于處理分布式存儲(chǔ)的數(shù)據(jù)表
uuid 主要解決的是分布式生成唯一編號(hào)的問題,但是不一定非要用現(xiàn)有的 uuid 方法,可以把每個(gè)機(jī)器都編個(gè)號(hào),這樣機(jī)器號(hào)加自增 id 也是一種 uuid
主鍵自增 id 衍生問題
Ⅰ、初始 3 條數(shù)據(jù),最大 id 是 3
Ⅱ、delete 第 3 條數(shù)據(jù)
Ⅲ、insert 一條數(shù)據(jù)
我們可以看到主鍵 id 不連續(xù),MySQL innodb 表的自增變量的值是內(nèi)存中的臨時(shí)值
● 刪除命令:
針對(duì)整張表數(shù)據(jù)(保留表結(jié)構(gòu))的刪除,可以使用 DELETE 或者 TRUNCATE,二者的區(qū)別如下:
① TRUNCATE 在各種表上無論是大的還是小的都非常快。如果有 ROLLBACK 命令 DELETE 將被撤銷,而 TRUNCATE 則不會(huì)被撤銷
② TRUNCATE不能進(jìn)行回滾操作,DELETE 語句執(zhí)行刪除的過程是每次從表中刪除一行,并且同時(shí)將該行的的刪除操作作為事務(wù)記錄在日志中保存以便進(jìn)行進(jìn)行回滾操作
③ 當(dāng)表被 TRUNCATE 后,這個(gè)表和索引所占用的空間會(huì)恢復(fù)到初始大小,而 delete 操作不會(huì)減少表或索引所占用的空間
④ 不能 TRUNCATE 一個(gè)帶有外鍵的表,如果要?jiǎng)h除首先要取消外鍵,然后再刪除
⑤ TRUNCATE 全表后,主鍵自增 id 會(huì)重新從 1 開始,而 delete 全表后自增 id 不從 1 開始
● 面試題 Ⅰ
如果 DELETE 第 3 行數(shù)據(jù)后,MySql 服務(wù)掛了,手動(dòng)重啟 MySql 服務(wù),請(qǐng)問在 InnoDB 和 MyISAM 存儲(chǔ)引擎中,新增一條數(shù)據(jù),自增 id 的值是 3 還是 4?
MyISAM 引擎:MyISAM 表會(huì)把自增主鍵的最大 ID 記錄到數(shù)據(jù)文件里,重啟 MySQL 自增主鍵的最大 ID 也不會(huì)丟失。
InnoDB 引擎:InnoDB 表把自增主鍵的最大 ID 記錄到內(nèi)存中,重啟數(shù)據(jù)庫(kù)后,都會(huì)導(dǎo)致最大自增 ID 重置。當(dāng)我們執(zhí)行 insert 操作的時(shí)候,MySQL 會(huì)默認(rèn)獲取到自增長(zhǎng)的最大值,類似于使用
SELECT MAX(id) FROM student FOR UPDATE; 然后再 + 1
所以說正確答案選 C
注意:在 MySql 8.0 版本中新增特性,「 自增主鍵持久化 」
將自增主鍵的計(jì)數(shù)器持久化到 redo log 中。每次計(jì)數(shù)器發(fā)生改變,都會(huì)將其寫入到 redo log 中。如果數(shù)據(jù)庫(kù)發(fā)生重啟,InnoDB 會(huì)根據(jù) redo log 中的計(jì)數(shù)器信息來初始化其內(nèi)存值。為了盡量減小對(duì)系統(tǒng)性能的影響,計(jì)數(shù)器寫入到 redo log 中,并不會(huì)馬上刷新。
● 面試題 Ⅱ
主鍵 id 不連續(xù)的解決辦法(假設(shè)主鍵 id 與其他表無關(guān)聯(lián))
① 去掉 id 主鍵自增
② 增加一列 idd 作為主鍵,設(shè)置為自動(dòng)遞增
③ 讓 id 列從 1 開始自增
④ 刪除idd
⑤ 將 id 重新設(shè)置為主鍵,加上自動(dòng)遞增
>>>Python 之 MySql“未解之謎”10--我以為我很懂MySql索引(下)
總結(jié)
以上是生活随笔為你收集整理的hibernate 复合主键 根据主键删除_Python 之 MySql“未解之谜”11--主键 id 那些事的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双绞线传输距离_视频监控系统中布线常用传
- 下一篇: 利用python做一个小游戏_如何使用p