编写Mysql查询以进行高级搜索

时间:2013-08-25 05:13:33

标签: mysql

我正在尝试编写mysql查询以进行我的网站的高级搜索,该网站是分类网站,我正在尝试过滤广告,我有:

  • t_userads
  • t_useradsvalues

useradsvalues包含用户选择的userad值,useradsvalues表结构:

  • ID
  • userAdID
  • fieldID
  • optionID

字段和选项已在另一个表格中定义。

例如:需要广告宝马汽车的彩色归档ID为10&绿色选项ID为33,门栏ID为8 ans 4门选项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个广告)并且这是一个问题,因为如果我有10万个广告需要怎么做?

谢谢。

1 个答案:

答案 0 :(得分: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)定义索引。

如果您只想要一个或几个广告,可以在查询结尾处使用LIMIT:http://dev.mysql.com/doc/refman/5.0/en/select.html

此外,请勿查询*:Why is SELECT * considered harmful?