簡體   English   中英

如何使用 Entity Framework Core 提高 as.net core 項目性能,升級我的 .NET 項目部分

[英]How can I faster aspnet core project performance with Entity Framework Core, Uptemize my .NET Project section

**我有兩張桌子,它有 Guid Id。 我可以做均衡Guid id,它不會降低性能嗎?

我怎樣才能更快的性能。 我沒有做其他想法,你有做嗎?**

我已經嘗試通過將 Guid Id 寫成字符串來將其與基匹配,那么性能如何。 我認為性能可能會下降,但我必須使用此 Guid,這是必要的。

您可能已經讀到,當在數據庫中用作 PK/FK 時,GUID 會產生性能成本,應該避免使用。 GUID 鍵存在性能和資源方面的考慮,但由於與處理它們相關的數據庫的優化和改進,它們不像以前那樣重要。

對密鑰使用 GUID 的首要考慮是“使用它們真的有必要/有好處嗎?” GUID 的主要好處是在使用分布式數據模型時,您可能擁有對等數據庫或分支和中心 model,其中應用程序希望在本地插入數據,然后與中央中心或其他客戶端同步,而沒有重疊 ID 的風險。 GUID 是一個很好、簡單的選擇,盡管要考慮的碰撞可能性非常小。 另一種方法是使用復合鍵,其中客戶端系統可以插入的每個表都需要一個 ClientId+TableId,這意味着每個 FK 都是 ClientId+TableId。 這是相當笨拙且容易出錯的。

如果您處理的是單個數據庫,而沒有真正將數據復制到其中,那么問題就變成了,為什么不只使用遞增的 Long ID?

使用 GUID 的另一個典型論點是使用不可預測的密鑰。 如果存在一個用戶可以用來查找特定行的鍵,並且用戶可以通過某些方式發現該鍵,那么您可能不想讓該鍵可預測或可猜測。 例如,如果我發送的 CustomerId 為 105,那么惡意用戶可以合理地猜測系統中存在 CustomerId 104、103、102 等,並開始探測漏洞。 如果他們看到“b0c468c6-97f1-495a-8242-9dd16df15ca8”的 CustomerId,那么猜測另一個客戶可能是什么就不是那么容易了。

GUID 的主要 arguments 是字段大小,為 16 字節,而 Long int 為 8 字節,然后是索引含義。 典型的 GUID 生成值會導致數據庫中出現相當多的索引碎片。 索引是一種允許數據庫快速定位相關記錄而無需通讀整個表的方法。 當數據庫圍繞相對隨機的數據構建索引時,插入新行可能會導致大型、低效的索引,其中保留空間,期望在添加行時“填充”,而不是在插入值時重新分配整個索引. 為了幫助緩解這種情況,許多數據庫提供了一種稱為順序 GUID 的東西。 這是進入 GUID 的相同基礎數據,但其排列方式使得對於給定機器生成 GUID 將更具順序性,因為 GUID 的重要部分是當前日期時間。 這導致值更像來自特定來源的順序,但來源之間明顯不同。 這會減少索引中的碎片,但也會使 ID 更容易被猜測。

因此,總結一些關於 GUID 和性能的建議:

  • 如果它是一個非分布式系統並且您不擔心暴露密鑰,請使用 Int/Long Int 進行 PKs/FKs
  • 如果是分布式系統,請考慮使用順序 GUID(如果可用)。
  • 如果隱藏 ID 很重要,因為它們可能會放在 URL 等上,那么我會使用 INT/Long Int PKs/FKs,然后添加一個唯一的、索引的 GUID 或類似 Snowflake 的東西來進行搜索。 您對索引進行了命中,但正常的關系索引命中將針對更有效的順序 Int 索引。
  • 使用 GUID 或順序 GUID 索引時,計划在數據庫上定期運行索引維護作業。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM