簡體   English   中英

使用每個表中的不同列查詢多個表的最有效方法是什么?

[英]What is the most efficient way to query multiple tables using a distinct column from each table?

我正在嘗試編寫一個有效的查詢,以從不同的表中提取多個列。 5個表中的每一個都很大。 我當前的查詢有效,但僅使用帳戶編號和代碼的50種組合花費了2分鍾以上。 我需要查詢返回3列,每列使用多個表中的條件從不同的表中返回。

這是當前查詢:

select table1.Name, table3.Account, table5.Code

from  db_table1 table1, db_table2 table2,
      db_table3 table3, db_table4 table4, db_table5 table5

where  table1.Name     = table2.Name     and 
       table2.ID       = 16              and
       table2.PhoneNum = table3.PhoneNum and
       table3.Account  = table4.Account  and 
       table4.Zip      = table5.Zip      and 
     ((table3.Account  = 1234567 and table5.Code = 'abcd') or
      (table3.Account  = 2345678 and table5.Code = 'bcde') or
      (table3.Account  = 3456789 and table5.Code = 'cdef'));

基本上,我有一個帳戶編號和代碼列表,需要查看哪些行的名稱與二者的組合相關。 我還只希望table2的ID = 16的行。我需要檢索的3列全部來自不同的表-由於這3個表不共享同一列,因此我被迫跨多個其他表進行聯接。

編輯:這是一個公司數據庫。 某些語句被禁止執行,例如刪除,創建,更改和刪除。

謝謝!

顯式聯接語法的主要好處是可讀性,它使實際聯接與有意交叉乘積變得更加明顯,並使聯接條件相對接近要聯接的表。

就實際速度而言,查詢優化器通常看起來可以很好地進行排序,因此通常不會對您造成任何傷害(除了無法利用諸如STRAIGHT_JOIN之類的查詢修飾符之外,您還可以強制執行優化器確實做出錯誤選擇的情況下的操作順序。)

例如,對我和其他許多人來說,這是您的查詢更具可讀性的版本:

SELECT t1.Name, t3.Account, t5.Code
FROM db_table1 AS 1
INNER JOIN db_table2 AS t2 ON t1.Name = t2.Name
INNER JOIN db_table3 AS t3 ON t2.PhoneNum = t3.PhoneNum
INNER JOIN db_table4 AS t4 ON t3.Account = t4.Account
INNER JOIN db_table5 AS t5 ON t4.Zip = t5.Zip
WHERE t2.ID = 16 
 AND 
 ((t3.Account = 1234567 AND t5.Code = 'abcd')
   OR (t3.Account = 2345678 AND t5.Code = 'bcde')
   OR (t3.Account = 3456789 AND t5.Code = 'cdef')
 )
;

我正在談論的UNION技術會將上面的查詢轉換為:

SELECT t1.Name, t3.Account, t5.Code
FROM db_table1 AS 1
INNER JOIN db_table2 AS t2 ON t1.Name = t2.Name
INNER JOIN db_table3 AS t3 ON t2.PhoneNum = t3.PhoneNum
INNER JOIN db_table4 AS t4 ON t3.Account = t4.Account
INNER JOIN db_table5 AS t5 ON t4.Zip = t5.Zip
WHERE t2.ID = 16 AND t3.Account = 1234567 AND t5.Code = 'abcd'
UNION
SELECT t1.Name, t3.Account, t5.Code
FROM db_table1 AS 1
INNER JOIN db_table2 AS t2 ON t1.Name = t2.Name
INNER JOIN db_table3 AS t3 ON t2.PhoneNum = t3.PhoneNum
INNER JOIN db_table4 AS t4 ON t3.Account = t4.Account
INNER JOIN db_table5 AS t5 ON t4.Zip = t5.Zip
WHERE t2.ID = 16 AND t3.Account = 2345678 AND t5.Code = 'bcde'
UNION
SELECT t1.Name, t3.Account, t5.Code
FROM db_table1 AS 1
INNER JOIN db_table2 AS t2 ON t1.Name = t2.Name
INNER JOIN db_table3 AS t3 ON t2.PhoneNum = t3.PhoneNum
INNER JOIN db_table4 AS t4 ON t3.Account = t4.Account
INNER JOIN db_table5 AS t5 ON t4.Zip = t5.Zip
WHERE t2.ID = 16 AND t3.Account = 3456789 AND t5.Code = 'cdef'
;

OR通常會使MySQL無法利用索引,這種方式使(有效地)多個查詢變得更簡單,並且可以再次利用索引。 但是,我不建議您在沒有必要的情況下進行此類操作,除非您完全確定需要該技術(在不斷增長的表上使用熟悉的模式),否則在許多情況下,運行更多查詢(這就是這種操作)不是最好的解決方案。

暫無
暫無

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

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