2011-01-24 49 views
0

我試圖創建一個搜索功能,用戶可以鍵入一個單詞或關鍵短語,然後顯示信息。mysql在加入和聯盟之間的搜索速度和/或其他

我想使用LEFT JOIN的添加所有的表,我需要被搜索,有人告訴我許多關於UNION,我有一種預感,這可能是慢JOIN

所以

$query = ' 
SELECT * 
FROM t1 
    LEFT JOIN t2 
    ON t2.content = "blabla" 
    LEFT JOIN t3 
    ON t3.content = "blabla" 
    [...] 
WHERE t1.content = "blabla" 
'; 

上述是一個好的做法還是有更好的方法,我應該看看?

向我發送此在正確的道路上也:)爭論爲什麼它的錯,認爲爲什麼你認爲你的做法是更好,所以這將有助於我和其他明白這一點:

回答

3

在一般情況下,這是一個壞主意玩預測來「猜測」SQL引擎的性能如何。這裏有非常複雜的優化,它考慮了表的大小,索引的可用性,索引的基數等等。

在此示例中,由於您生成半笛卡爾JOIN,因此LEFT JOIN錯誤。基本上,結果集中會有比您想象的更多的批次。這是因爲t1中的每個匹配行將與t2中的每個匹配行連接。如果在t1中有十行匹配,在t2中有三個匹配,那麼你將不會得到十個結果,而是三十個。

即使只有一行保證與每個表匹配(消除了笛卡爾連接問題),很明顯LEFT JOIN解決方案將爲您提供一個很難處理的數據集。這是因爲您加入的每個表格中的內容列在結果集中將分別爲個獨立的列。你必須檢查每一列來找出匹配的表。

在這種情況下,UNION是一個更好的解決方案。

另外,請注意:在SELECT

  1. 使用 「*」 一般是不是一個好主意。它會降低性能(因爲所有列都必須在結果集中進行彙編),並且在這種情況下,您將失去ALIAS每個內容列的機會,從而難以處理結果集。

  2. 這是一個非常新穎的使用LEFT JOIN。通常,它用於關聯兩個不同表中的行。在這種情況下,您正在使用它來「並排」生成三個單獨的結果集。大多數SQL程序員必須仔細研究一下這段話,才能弄清楚你的意圖是什麼。

+0

哦不,我簡化了所有的東西:)它是一個示例sql,我也使用`*`,但每個表都將有一個標題,內容字段和幾個常見字段,這就是我將搜索和忽略其餘。我仍然處在一個十字路口,不知道什麼是處理多表搜索的最佳方式 – Val 2011-01-24 15:04:26