2012-04-17 129 views
0

Optimizing your SQL queries的一篇文章曾建議使用聯盟insted的的或`原因:至少在
在MySQL OR-情況下,使用的時候我是否必須使用UNION insted JOIN?

利用聯盟的替代或

指數失去了速度優勢。因此,雖然索引是
施加1 SELECT * FROM TABLE WHERE COLUMN_A =「值」 OR
COLUMN_B =「值」

在另一方面,使用聯盟如此將利用索引這將不會是有用。
1- SELECT * FROM TABLE WHERE COLUMN_A = '值'
2- UNION 3- SELECT * FROM
TABLE WHERE COLUMN_B = '值'

多少這個建議是真的?我應該把我的OR查詢交給Union嗎?

+0

敏銳的讀者會注意到這些例子涉及在**不同**列上操作的ORing條件,這當然不是偶然的。你自己的ORs是那樣的嗎? – Jon 2012-04-17 11:09:18

+0

積極。你有什麼建議? – ALH 2012-04-17 11:12:18

+0

出於我的領域,所以不能說。但是你可以'解釋'這兩個查詢,看看MySql怎麼看待它們。 – Jon 2012-04-17 11:14:18

回答

0

我不推薦將此作爲一般規則。我沒有在這裏安裝MySQL,因此無法檢查生成的執行計劃,但在Oracle中肯定計劃有很大不同,「OR」計劃比「UNION」計劃更有效。 (基本上,'UNION'必須執行兩個SELECT,然後合併結果 - 'OR'只需執行一次SELECT操作)。即使是「聯盟所有」計劃的成本也比「或」計劃高。堅持'或'。

我強烈建議您寫出最清晰,最簡單的代碼。對我而言,這意味着你應該使用'OR'而不是'UNION'。多年來,我發現試圖「預先優化」某些東西,或者換句話說,猜測我會遇到性能問題,然後嘗試解決這些問題,這是浪費時間。代碼往往會在最尷尬的地方花費大量時間,而且只有在運行代碼後才能找到它們。很久以前,我學習了三條規則,我發現它們在這方面很有用:

  1. Make if run。
  2. 讓它正確運行。
  3. 讓它跑得快。

優化實際上是你應該做的最後一件事。

分享和享受。


跟帖:我沒有注意到的是,「OR」看着不同的列(我的壞),但我的建議關於「保持簡單」猶抱。

+0

如果這是一個代碼清晰的問題,我會說你是對的,但SQL查詢處理巨大的while循環,可能涉及數百萬條記錄。如果你不優化這些,你會優化什麼? – Neil 2012-04-17 11:18:55

+0

@Neil:根據我的經驗,只有在出現性能問題時才能嘗試優化。如果並且直到出現性能問題,沒有什麼可以優化的,因爲這樣的優化工作將浪費在不成問題的事情上。我發現最好寫出最乾淨和最簡單的代碼,因爲A)大多數時候它會工作得很好,以及B)當性能問題出現時,簡單的代碼可以很容易理解,可以創建性能更好的版本。 – 2012-04-17 11:27:22

+1

@Bob_Jarvis:那麼意見分歧。我認爲如果優化並不意味着犧牲清晰度,你應該這樣做。我不認爲工會不清楚,而是相反。事實上,有時將長sql查詢合併爲一個select可能很難閱讀。 – Neil 2012-04-17 12:40:01

0

它有助於思考電話簿中的姓名索引。你可以說,電話簿有一個按名稱自然排序的索引,這意味着,如果你想查找所有約翰史密斯的名字,那麼你幾乎沒有時間去找它。您只需將電話簿打開到S部分,然後開始查找Smith。

現在如果我告訴你在電話簿中以名稱John Smith或電話號碼863-2253查找條目,該怎麼辦。沒有那麼快,呃?爲了提供準確的答案,您需要一個電話簿來查找約翰史密斯和另一個電話號碼,以便通過他或她的電話號碼查找姓名。

也許一個更復雜的引擎可能會看到這種分離的需要並自動執行,但顯然MySQL不會。所以雖然這樣做可能看起來很麻煩,但我向你保證,高記錄數表的差異是顯而易見的。

相關問題