2015-09-11 18 views
0

我有一個選擇查詢哪一個有很多條件變量在裏面,所有索引和第二個索引條件變量較少。主要的有條件的是** XX **內的,其餘的都是可選的。你能建議哪一個可能會導致更快,更好的查詢請。mysql選擇性能(許多變量與索引vs較少有索引的變量)

我只需要知道是否可以通過更多的可選索引條件變量與更少。

1)  SELECT * 
    FROM tableX 
    WHERE city_id = :city_id 
     AND category_id = :category_id 
     AND type_id = :type_id 
     AND **valid_date** > :date_now 
     AND (**N_lat** BETWEEN :sw_lat AND :ne_lat) 
     AND (**E_lng** BETWEEN :sw_lng AND :ne_lng) 
     AND (**price_deposit** BETWEEN :min_deposit AND :max_deposit) 
     AND (**price_rent** BETWEEN :min_rent AND :max_rent) 
    ORDER BY $colomnX DESC 

2)  SELECT * 
    FROM tableX 
    WHERE **valid_date** > :date_now 
     AND (**N_lat** BETWEEN :sw_lat AND :ne_lat) 
     AND (**E_lng** BETWEEN :sw_lng AND :ne_lng) 
     AND (**price_deposit** BETWEEN :min_deposit AND :max_deposit) 
     AND (**price_rent** BETWEEN :min_rent AND :max_rent) 
    ORDER BY $colomnX DESC 
+2

使用EXPLAIN http://dev.mysql.com/doc/refman/5.5/en/explain-output.html – Naktibalda

+0

更多的條件=更多的比較,這將吃更多的CPU。你無法解決這個問題。另一方面,實際從存儲中獲取匹配記錄的成本可能會超過比較成本,因此通過儘早消除更多記錄來減少獲取要求可能會有所幫助。但總的來說,我們無法回答這個問題。它完全取決於你的索引結構,以及數據庫如何執行。 –

+0

謝謝,我會考慮通過消除更多的可選變量來減少索引,以便節省更多的CPU,但我不確定這是否會導致mysql通過減少條件讀取更多記錄? –

回答

2

查詢1:這是最佳指數:

INDEX(city_id, category_id, type_id, one-more-thing) 

前三個字段可以以任何順序,所述第四可爲任何其它字段是「範圍」測試的。

查詢2:要麼的這些可能是benefical:

INDEX(any-one-of-the-columns-mentioned-in-WHERE) 
INDEX($columnX) 

至於其中列指數,很好,這是很難預測。您可以爲每個索引創建單列索引,並讓優化器動態選取。

提到兩個在「範圍」測試中的列在索引中幾乎沒有用處。優化器可能會使用第一個,但不會使用第二個。

查詢2可能會提供比查詢1更多的行,因此比較它們是沒有意義的。

關於my cookbook的更多討論。

+0

非常感謝。 –