我正在尝试编写mysql查询以进行我的网站的高级搜索,该网站是分类网站,我正在尝试过滤广告,我有:
useradsvalues包含用户选择的userad值,useradsvalues表结构:
字段和选项已在另一个表格中定义。
例如:需要广告宝马汽车的彩色归档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万个广告需要怎么做?
谢谢。
答案 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?