在MySql中强制执行查询以使用特定索引

时间:2010-05-13 21:50:44

标签: sql mysql indexing query-optimization

我有大桌子。仅包含3列(id(INT),bookmarkID(INT),tagID(INT))。我有两个BTREE索引,每个bookmarkID和tagID列一个。该表有大约2100万条记录。我正在尝试运行此查询:

SELECT bookmarkID,COUNT(bookmarkID) AS count
FROM bookmark_tag_map
GROUP BY tagID,bookmarkID
HAVING tagID IN (-----"tagIDList"-----) AND count >= N

这需要很长时间才能返回结果。我在某处读到如果制作一个索引,其中它有tagID,bookmarkID在一起,我会得到更快的结果。一段时间后我创建了索引。再次尝试查询,但似乎这个查询没有使用我所做的新索引。我运行了EXPLAIN,看到它确实是真的。我现在的问题是如何强制执行查询以使用特定索引?还欢迎评论其他方法来加快查询速度。感谢

2 个答案:

答案 0 :(得分:3)

首先,在group by子句中使用tagID,但在选定的字段中没有,这很奇怪,因为你不知道计数属于哪个标签。您确定要在分组中使用tagID吗?如果您只想要某些标签集的最常用书签,那么您不需要它。 我提出加快速度的建议是将tagID条件移到where子句中:

SELECT bookmarkID,COUNT(bookmarkID) AS count
FROM bookmark_tag_map
WHERE tagID IN (-----"tagIDList"-----)
GROUP BY bookmarkID
HAVING count >= N

这应该快得多,但对于1200万条记录来说,可能仍然不够快,无法在没有缓存的情况下在频繁调用的页面上使用它。

答案 1 :(得分:2)