Query-Performance

優化 500 萬條記錄的 SQL 查詢(使用與否?!)

  • August 15, 2022

我有一張products包含近500 萬條記錄的表。

我有一個產品類別的專欄(product_category)。它現在是類型INT(11),它是一個索引並且引用另一個表(categories表)類別表只包含類別的名稱

類別名稱是靜態的,從不更新或編輯。

在最快的查詢中始終獲得產品類別名稱的最佳解決方案是什麼?

  • 使用連接方法
  • 使用子查詢方法
  • 類別名稱作為 a儲存string在 products 表中。

如果有任何其他建議會很好,那麼上述選項的最佳最佳解決方案是什麼?

當然,將數據儲存在單個表中幾乎總是將數據具體化以供讀取的“最快”方式。但是在數據庫系統中,當您對數據進行非規範化時,您會遇到數據維護和準確性方面的問題。當同時從表中寫入和讀取數據時,您甚至可能會遇到阻礙數據庫性能的問題。

例如,假設您想categories在應用程序中顯示唯一的列表。好吧,您必須執行一個查詢SELECT DISTINCT CategoryName FROM products才能這樣做,可能會掃描整個 500 萬行表。對性能來說不是很好。如果有一天一組products更改以某種方式使它們更適合成為不同的一部分category?…更新這些記錄將鎖定表和/或被鎖定等待上述查詢完成,只要應用程序被跑了。同樣,在性能方面不是很好。

還有許多其他原因,您也應該規範化您的數據。將不同的列表儲存categories到它自己的表中可能對整體性能、數據準確性和管理是最好的。500 萬行實際上並不是一張大表,當索引適當時JOIN,使用像這樣的小表categories會非常快(可能與將所有內容儲存在單個表中的情況不同幾毫秒)。此外,如果您並不總是products從數據庫系統中讀取全部 500 萬條數據,而是一次讀取一個子集,那麼products表的大小並不重要(再次正確索引時)。

引用自:https://dba.stackexchange.com/questions/315631