偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

憑什么不讓使用外鍵?。磕阒绬??

數(shù)據(jù)庫(kù) 其他數(shù)據(jù)庫(kù)
當(dāng)數(shù)據(jù)量打的時(shí)候,我們就要考慮分庫(kù)分表了,但是在分庫(kù)分表環(huán)境中,相關(guān)數(shù)據(jù)可能分布在不同的數(shù)據(jù)庫(kù)中,外鍵通常難以跨越不同數(shù)據(jù)庫(kù)來(lái)建立關(guān)系。更重要的是,分庫(kù)分表環(huán)境中,數(shù)據(jù)的一致性可能更難維護(hù)??鐜?kù)事務(wù)搞不定。

MySQL 外鍵(Foreign Key)是用于建立表之間關(guān)系的,它定義了一個(gè)表中的一列或一組列,這些列的值必須在另一個(gè)表的主鍵列中存在。

MySQL 外鍵最大的作用就是有助于維護(hù)數(shù)據(jù)的一致性和完整性。

  • 一致性:如果一個(gè)訂單表引用了一個(gè)客戶(hù)表的外鍵,外鍵可以確保訂單的客戶(hù) ID 存在于客戶(hù)表中,從而保持?jǐn)?shù)據(jù)的一致性。
  • 完整性:外鍵可以防止在引用表中刪除正在被其他表引用的記錄,從而維護(hù)數(shù)據(jù)的完整性。

但是,其實(shí)在很多大型互聯(lián)網(wǎng)公司中,很少用外鍵的,甚至阿里巴巴Java開(kāi)發(fā)手冊(cè)中明確規(guī)定了:

【強(qiáng)制】不得使用外鍵與級(jí)聯(lián),一切外鍵概念必須在應(yīng)用層解決。 

說(shuō)明: 以學(xué)生和成績(jī)的關(guān)系為例,學(xué)生表中的 student_id 是主鍵,那么成績(jī)表中的 student_id 則為外鍵。如果更新學(xué)生表中的 student_id,同時(shí)觸發(fā)成績(jī)表中的 student_id 更新,即為級(jí)聯(lián)更新。外鍵與級(jí)聯(lián)更新適用于單機(jī)低并發(fā),不適合分布式、高并發(fā)集群;級(jí)聯(lián)更新是強(qiáng)阻塞,存在數(shù)據(jù)庫(kù)更新風(fēng)暴的風(fēng)險(xiǎn);外鍵影響數(shù)據(jù)庫(kù)的插入速度。

那么,使用外鍵會(huì)帶來(lái)哪些問(wèn)題呢?(另外我出了一份Java面試寶典,里面有800多道面試常考題目

先舉個(gè)例子,我們有兩張表:Orders(訂單)和 OrderItems(訂單項(xiàng))。這兩個(gè)表之間通過(guò)外鍵建立關(guān)系,訂單項(xiàng)表中的外鍵引用訂單表的訂單號(hào)。

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    -- 其他訂單信息
);

CREATE TABLE OrderItems (
    ItemID INT PRIMARY KEY,
    OrderID INT,
    ProductID INT,
    Quantity INT,
    -- 其他訂單項(xiàng)信息
    FOREIGN KEY (OrderID) REFERENCES Orders(OrderID)
);

性能問(wèn)題

首先就是性能問(wèn)題,因?yàn)橥怄I會(huì)增加數(shù)據(jù)庫(kù)的維護(hù)負(fù)擔(dān),因?yàn)槊看尾迦?、更新或刪除數(shù)據(jù)時(shí),數(shù)據(jù)庫(kù)都需要檢查外鍵約束的完整性。

這兩張表中共有兩個(gè)索引,一個(gè)是Orders表的主鍵索引,一個(gè)是OrdersItems表的外鍵索引,這就使得每次插入、更新或刪除訂單或訂單項(xiàng)時(shí),數(shù)據(jù)庫(kù)需都要維護(hù)這兩個(gè)索引,這可能會(huì)導(dǎo)致性能開(kāi)銷(xiāo)。

其次,在插入新的訂單項(xiàng)之前,數(shù)據(jù)庫(kù)需要執(zhí)行數(shù)據(jù)一致性檢查以確保引用的訂單號(hào)在 Orders 表中存在。這額外的檢查可能增加插入訂單項(xiàng)的執(zhí)行時(shí)間。

鎖競(jìng)爭(zhēng)問(wèn)題

還有就是比較容易忽略的鎖競(jìng)爭(zhēng)問(wèn)題。當(dāng)多個(gè)事務(wù)同時(shí)嘗試插入或更新訂單項(xiàng)時(shí),它們就需要去檢查訂單表,就需要獲得額外的鎖,以確保一致性。這可能導(dǎo)致事務(wù)之間的鎖競(jìng)爭(zhēng),降低并發(fā)性能。(另外我出了一份Java面試寶典,里面有800多道面試常考題目

一旦有了鎖競(jìng)爭(zhēng),就可能帶來(lái)更加嚴(yán)重的死鎖問(wèn)題,所以都是需要盡量避免的。

Merge無(wú)法適應(yīng)分庫(kù)分表

當(dāng)數(shù)據(jù)量打的時(shí)候,我們就要考慮分庫(kù)分表了,但是在分庫(kù)分表環(huán)境中,相關(guān)數(shù)據(jù)可能分布在不同的數(shù)據(jù)庫(kù)中,外鍵通常難以跨越不同數(shù)據(jù)庫(kù)來(lái)建立關(guān)系。更重要的是,分庫(kù)分表環(huán)境中,數(shù)據(jù)的一致性可能更難維護(hù)??鐜?kù)事務(wù)搞不定。

以上,就是一些比較重要的原因吧。其實(shí)最主要的還是外鍵約束會(huì)帶來(lái)一些額外的開(kāi)銷(xiāo)及鎖競(jìng)爭(zhēng)。而在很多大型互聯(lián)網(wǎng)公司中,都是會(huì)盡量避免的。

就像大廠會(huì)使用RC來(lái)替代RR一樣,會(huì)盡可能的降低鎖的發(fā)生,一方面提升性能,一方面避免死鎖。

責(zé)任編輯:武曉燕 來(lái)源: Hollis
相關(guān)推薦

2024-04-30 09:02:48

2023-12-20 08:23:53

NIO組件非阻塞

2024-07-30 08:22:47

API前端網(wǎng)關(guān)

2024-04-07 00:00:03

2024-08-20 08:29:55

2024-10-10 16:53:53

守護(hù)線程編程

2024-11-08 09:48:38

異步編程I/O密集

2025-02-18 08:11:17

2022-11-28 00:04:17

2024-01-15 12:16:37

2023-11-02 10:22:29

gRPC后端通信

2024-10-09 08:19:35

2023-07-11 00:12:05

2024-06-27 10:51:28

生成式AI領(lǐng)域

2024-03-19 08:01:54

服務(wù)熔斷軟件設(shè)計(jì)模式微服務(wù)

2020-11-17 08:30:06

LinuxSwapping 設(shè)計(jì)

2024-02-19 07:44:52

虛擬機(jī)Java平臺(tái)

2023-08-29 09:31:01

Scrapy網(wǎng)頁(yè)爬蟲(chóng)

2022-11-22 08:01:34

dotNET 7API

2020-10-08 18:58:46

條件變量開(kāi)發(fā)線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)