2013-02-26 57 views
0

我有2個表,我需要加入他們。不幸的是,我沒有我可以使用的ID,唯一的標準是一些varchar列。這是「對」的一部分加盟:MySQL:如何加速連接?

join sales_flat_order_address sfoa on  
    concat(lower(trim(sfoa.firstname)), lower(trim(sfoa.lastname))) = concat(lower(trim(so.firstname)), lower(trim(so.lastname))) 

我知道,這是不是最快的方法,但有沒有辦法spped這件事多一點?或者,也許我現在不能想到一個解決方法?

謝謝!

+0

這將是當你的表變得更大更慢,因爲它會執行'由於不使用'INDEX'全表scan'。我唯一的建議是規範你的表格。 – 2013-02-26 15:32:35

+0

您的條件和數據非常專業化,它使我們很難知道可能存在哪些其他選項。這不是一個非常好的數據庫設計。 – crush 2013-02-26 15:33:55

+0

執行這樣的功能本質上是潛在的性能拖延。建議改變表格以在每個表格上包含索引ID字段以及相應的主鍵/外鍵,相應地改變連接,應該在很長時間內產生顯着的性能提升和更好的可擴展性。 – 2013-02-26 15:34:23

回答

1

您可以嘗試使用此:

ON trim(sfoa.firstname) = trim(so.firstname) 
    AND trim(sfoa.lastname) = trim(so.lastname) 
當然

,你可以嘗試兩個表中的索引firstnamelastname

0

至少,你應該建立在名字和姓氏兩個表中的索引。另外,對你的查詢運行解釋。這可以告訴你效率低下。

2

索引名字和姓氏列將是一個開始。

首先,雖然我會跑在它前面解釋你的查詢,看看是否有您可能已經擁有並認爲正在使用的實際可能沒有正在使用的任何索引。

其次,入世對VARCHAR永遠不會是「超級」比較快加入的例如一個int。

http://dev.mysql.com/doc/refman/5.5/en/explain.html

1

您可以添加一個「和」姓和名之間,以避免CONCAT。你也可以在這些列上使用索引(名字和姓氏),以加快速度(特別是如果你使用比較的話)。

join sales_flat_order_address sfoa on  
trim(sfoa.firstname) = trim(so.firstname) and trim(sfoa.lastname) = trim(so.lastname) 
1

該查詢基本上是做餐桌上的交叉連接,然後與條件匹配。要解決此問題,您可以:

  1. 向每個稱爲全名的表中添加一個新列。
  2. 給出的是這樣的值: concat(lower(trim(firstname)), lower(trim(lastname)))
  3. 構建該值的索引。

其實,你可以做到這一點只在表中的一個,和MySQL將使用索引進行比較(還需要在第一個表進行全表掃描。

你也可以有一個「全名「表,並使用這些表中的每一個的外鍵來獲得全名

獨立索引名稱不會影響查詢名稱在函數內部被訪問,這通常會關閉能力。使用索引