2013-08-25 57 views
-1

我想寫MySQL查詢進行高級搜索我的網站的MySQL查詢,網站分類的網站,我想過濾的廣告,我有:寫進行高級搜索

  • t_userads
  • t_useradsvalues

的useradsvalues包含userad值,用戶選擇,useradsvalues表結構:

  • ID
  • userAdID
  • fieldID
  • optionID

的字段和選項在另一個表中已經定義。

例如:寶馬車需要的廣告已經彩色申請ID是10 &綠色選擇標識爲33也是門領域的ID是8 ANS 4doors選項ID是15

現在我試着寫

SELECT 
    * 
FROM `t_userads` 
WHERE 
    (`categoryID` = 53 OR `categoryID` = 54 OR `categoryID` = 141) 
    AND `countryID` = 8 
    AND `ad_active` = 1 
    AND `id` IN (
    SELECT 
     `useradID` 
    FROM `t_useradsvals` 
    WHERE (`fieldID` = 10 AND `optionID` = 33) AND `useradID` IN (
     SELECT 
     `useradID` 
     FROM `t_useradsvals` 
     WHERE (`fieldID` = 8 AND `optionID` = 15) 
    ) 
) 

我得到了正確的結果,但mysql查詢花了大約6秒來執行(我有5000個廣告),這是一個問題,因爲如果我有100,000個廣告會如何處理?

謝謝。

+1

閱讀關於使用JOIN和限制,索引... – Shomz

+0

還可以考慮在(53,54,141)中使用categoryId。您可以參考:http://stackoverflow.com/questions/782915/mysql-or-vs-in-performance獲取經驗數據。 – aztechy

回答

1

您的查詢速度特別慢,因爲您在WHERE子句中使用嵌套查詢,這意味着可能會針對每行評估重新執行查詢。你做了兩次級聯,所以它做了很多很多額外的計算。

你需要使用MySQL JOIN:http://dev.mysql.com/doc/refman/5.0/en/join.html

SELECT a.* 
FROM t_userads a 
    JOIN t_useradsvals v1 ON a.id = v1.useradID 
    JOIN t_useradsvals v2 ON v1.useradID = v2.useradID 
WHERE a.categoryID IN (53, 54, 141) 
    AND a.countryID = 8 
    AND a.ad_active = 1 
    AND v1.`fieldID` = 10 
    AND v1.`optionID` = 33 
    AND v2.`fieldID` = 8 
    AND v2.`optionID` = 15; 

,並定義一個指數(useradID,fieldID,optionID)。

如果你只想1個或幾個廣告,就可以在查詢的末尾使用LIMIT:http://dev.mysql.com/doc/refman/5.0/en/select.html

另外,不要查詢*:Why is SELECT * considered harmful?