选择中的优化选择

时间:2013-12-09 17:58:50

标签: mysql sql

SELECT ID, title, image, FROM items WHERE  ID IN (
  SELECT tags_relationships.post_id
  FROM tags_relationships
    INNER JOIN tags
    ON tags.tag_id = tags_relationships.tag_id
  WHERE tags.name = 'white'
  ) 

AND
 ID IN (
  SELECT tags_relationships.post_id
  FROM tags_relationships
    INNER JOIN tags
    ON tags.tag_id = tags_relationships.tag_id
  WHERE tags.name = 'bike'
  ) 

 AND status = 'publish' ORDER BY ID DESC LIMIT 1860,20

嗨,再次。 当有人搜索“白色自行车”时,我有这个问题,结果很好,倾倒所有物品,白色和自行车标签。 这个查询的问题是花费太多时间> 2秒,因为items表有大约200k行和tags_relationships大约1.5 mil行。 我已经尝试过处理索引,但我知道我的查询应该采用类似的方法,以便更快地进行审讯。

2 个答案:

答案 0 :(得分:2)

等效查询 *如果tags_relationships具有唯一的对(post_id,tag_id)

SELECT items.* FROM items 
INNER JOIN tags_relationships r1 ON (r1.post_id = items.id)
INNER JOIN tags_relationships r2 ON (r2.post_id = items.id)
INNER JOIN tags t1 ON (t1.tag_id = r1.tag_id)
INNER JOIN tags t2 ON (t2.tag_id = r2.tag_id)
WHERE 
    t1.name = 'white'
AND t2.name = 'bike'
AND items.status = 'publish' 
ORDER BY ID DESC

但是,它完全等效,包括执行计划,因为'IN(子查询)'构造在唯一连接字段的情况下是内连接本身。 tags_relationships的主键或唯一索引应该是复杂的(post_id,tag_id)。

答案 1 :(得分:0)

这个怎么样,

SELECT 
ID, 
title, 
image 
FROM items 
WHERE  
ID IN 
(
SELECT tags_relationships.post_id
FROM tags_relationships
INNER JOIN tags
ON tags.tag_id = tags_relationships.tag_id
WHERE tags.name IN ('white') AND tags.name IN ('bike')
) 
AND status = 'publish' 
ORDER BY ID DESC 
LIMIT 1860,20