成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

憑什么不讓使用外鍵!?你知道嗎?

數據庫 其他數據庫
當數據量打的時候,我們就要考慮分庫分表了,但是在分庫分表環境中,相關數據可能分布在不同的數據庫中,外鍵通常難以跨越不同數據庫來建立關系。更重要的是,分庫分表環境中,數據的一致性可能更難維護。跨庫事務搞不定。

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

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

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

但是,其實在很多大型互聯網公司中,很少用外鍵的,甚至阿里巴巴Java開發手冊中明確規定了:

【強制】不得使用外鍵與級聯,一切外鍵概念必須在應用層解決。 

說明: 以學生和成績的關系為例,學生表中的 student_id 是主鍵,那么成績表中的 student_id 則為外鍵。如果更新學生表中的 student_id,同時觸發成績表中的 student_id 更新,即為級聯更新。外鍵與級聯更新適用于單機低并發,不適合分布式、高并發集群;級聯更新是強阻塞,存在數據庫更新風暴的風險;外鍵影響數據庫的插入速度。

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

先舉個例子,我們有兩張表:Orders(訂單)和 OrderItems(訂單項)。這兩個表之間通過外鍵建立關系,訂單項表中的外鍵引用訂單表的訂單號。

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

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

性能問題

首先就是性能問題,因為外鍵會增加數據庫的維護負擔,因為每次插入、更新或刪除數據時,數據庫都需要檢查外鍵約束的完整性。

這兩張表中共有兩個索引,一個是Orders表的主鍵索引,一個是OrdersItems表的外鍵索引,這就使得每次插入、更新或刪除訂單或訂單項時,數據庫需都要維護這兩個索引,這可能會導致性能開銷。

其次,在插入新的訂單項之前,數據庫需要執行數據一致性檢查以確保引用的訂單號在 Orders 表中存在。這額外的檢查可能增加插入訂單項的執行時間。

鎖競爭問題

還有就是比較容易忽略的鎖競爭問題。當多個事務同時嘗試插入或更新訂單項時,它們就需要去檢查訂單表,就需要獲得額外的鎖,以確保一致性。這可能導致事務之間的鎖競爭,降低并發性能。(另外我出了一份Java面試寶典,里面有800多道面試常考題目

一旦有了鎖競爭,就可能帶來更加嚴重的死鎖問題,所以都是需要盡量避免的。

Merge無法適應分庫分表

當數據量打的時候,我們就要考慮分庫分表了,但是在分庫分表環境中,相關數據可能分布在不同的數據庫中,外鍵通常難以跨越不同數據庫來建立關系。更重要的是,分庫分表環境中,數據的一致性可能更難維護。跨庫事務搞不定。

以上,就是一些比較重要的原因吧。其實最主要的還是外鍵約束會帶來一些額外的開銷及鎖競爭。而在很多大型互聯網公司中,都是會盡量避免的。

就像大廠會使用RC來替代RR一樣,會盡可能的降低鎖的發生,一方面提升性能,一方面避免死鎖。

責任編輯:武曉燕 來源: Hollis
相關推薦

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2025-02-18 08:11:17

2024-01-15 12:16:37

2022-11-28 00:04:17

2024-07-30 08:22:47

API前端網關

2024-08-20 08:29:55

2024-04-07 00:00:03

2024-10-10 16:53:53

守護線程編程

2024-11-08 09:48:38

異步編程I/O密集

2020-11-17 08:30:06

LinuxSwapping 設計

2024-02-19 07:44:52

虛擬機Java平臺

2024-03-19 08:01:54

服務熔斷軟件設計模式微服務

2023-11-02 10:22:29

gRPC后端通信

2023-07-11 00:12:05

2024-10-09 08:19:35

2024-06-27 10:51:28

生成式AI領域

2020-10-08 18:58:46

條件變量開發線程

2022-11-22 08:01:34

dotNET 7API

2023-08-29 09:31:01

Scrapy網頁爬蟲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久国内 | 国产精品久久久久无码av | 少妇精品亚洲一区二区成人 | 91日韩在线 | 亚洲成人www | 久久久久一区二区 | 亚洲免费视频一区二区 | 91精品国产综合久久久久久蜜臀 | 久久久久久亚洲国产精品 | 亚洲国产日本 | 91n成人 | 午夜精品久久 | 福利二区 | 影音先锋欧美资源 | 国产一卡二卡三卡 | 91xx在线观看 | 天天看逼 | 国产精品色| 国产精品不卡视频 | 亚洲a一区二区 | 国产一区二区 | 国产欧美精品在线观看 | 91久久久久 | 中文字幕视频在线 | 一区在线视频 | 欧美a级成人淫片免费看 | 精品美女视频在线观看免费软件 | 免费一级片 | 久久久精品视频免费 | 久国产视频 | 日本精品一区二区三区在线观看视频 | 国产一区二区三区 | 亚洲精品国产电影 | 国产自产c区| 麻豆亚洲 | 96久久久久久| 污污免费网站 | aa级毛片毛片免费观看久 | 男人影音 | 日本高清视频在线播放 | 天天天插|