2012-07-23 127 views
4

我有多個表,可以通過連接查詢數據。從多個表中選擇多個選擇還是從所有表中選擇所有數據1次更好?

在關於數據庫的性能:

我應該運行的所需數據的多個表的多個選擇?

如果我寫1選擇使用一堆加入一次選擇從所有表所需的數據?

編輯:

的,我將使用select子句中包含的表的索引字段。聽起來就是因爲這樣,使用1個select語句和許多連接將會更快。然而,我仍然會測試2.

之間的性能差異感謝您的所有優秀答案。

+3

一般來說,我會用一個'SELECT'語句去。關係數據庫非常適合優化查詢執行。如果有疑問,您可以始終分析兩種方法並查看哪種方法更好。 – David 2012-07-23 17:33:57

+0

我從來沒有分析數據庫。我如何測試性能? – Mausimo 2012-07-23 17:34:41

+0

這完全取決於你正在使用的數據庫。例如,對於MS SQL Server,您可以在SQL Management Studio中檢查查詢執行計劃以獲取查詢每一步的詳細分析。在MySQL中,您可以使用'EXPLAIN'關鍵字來分析查詢執行計劃。爲了測試一般性能,您可以編寫一個小型應用程序,該程序可以多次執行這兩個選項,並獲得每次執行的平均時間範圍。 – David 2012-07-23 17:37:05

回答

3

只需使用連接編寫一個查詢。如果你關心性能有包括多種選擇:

  • 創建索引,這將有助於你選擇
  • 的性能創建數據的,你要那麼你可以查詢一個表中的持久性非規範化的形式。這很可能是一個索引視圖或另一個表。
3

這可能是其中的一個,精心哎呀,它-依賴,但是總的來說,如果你正在編寫SQL直接做一個查詢 - 特別是因爲加入可能會限制一些你找回數據。

如果您爲每個表中的一條記錄執行多點查詢,如果您使用表的主鍵進行查找,那麼很可能每個查詢的連接成本比實際查詢的成本更高。

2

這取決於表如何加入。如果你做了所有表的交叉產品,那麼做單獨選擇會更好。但是,如果您的表格已正確編制索引並經過深思熟慮,則具有多個選擇的查詢會更有效。

2

如果您的表格上有適當的索引,那麼使用JOIN可能會更好,但它們通常是造成瓶頸的原因。您可能會想辦法解除您的數據規範化,而不是多次選擇。當用戶執行一個操作來更新多個表中的計數或時間戳時,這種方法遠沒有那麼「昂貴」,從而無法加入這些表。

我發現查詢性能調整的最佳工具是使用EXPLAIN。在查詢之前鍵入EXPLAIN,您可以看到有多少行被掃描。你的目標是數字越低越好,這意味着你的索引正在工作。另一件事是在創建索引時,在多個字段上使用複合索引,並按照它們在WHERE子句中出現的順序從左到右排列它們。

例如你在sometable 10,000行:

SELECT id, name, description, status FROM sometable WHERE name LIKE '%someName%' AND status = 'Active'; 

您可以鍵入查詢之前解釋並可能返回10,000爲掃描相匹配的行數。然後創建一個複合索引:

ALTER TABLE sometable ADD INDEX idx_st_search (name, status); 

你再執行再解釋上表中,並可能返回1作爲掃描行和性能顯著改善的數量。

+0

當然,破解正常化也有其不利之處 - 您對事務的控制必須更加精確。另外,索引列順序通常與大多數現代DBMS中的where子句中的顯示方式無關 - 它們將解析查詢並優化最佳索引以供使用。 – 2012-07-23 17:43:01

1

取決於您的餐桌設計。

大部分時間一個大的查詢是更好,但一定要

  • 使用在主鍵where子句中儘可能多的,你可以爲連接。

  • 使用索引字段或使用where子句中使用的字段的索引。