【问题标题】:Enforcing a query in MySql to use a specific index在 MySql 中强制查询以使用特定索引
【发布时间】:2010-05-13 21:50:43
【问题描述】:

我有一张大桌子。仅由 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 并看到它实际上是正确的。我现在的问题是如何强制查询使用特定索引?也欢迎 cmets 以其他方式使查询更快。谢谢

【问题讨论】:

    标签: sql mysql indexing query-optimization


    【解决方案1】:

    首先,在 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 万条记录,可能仍然不够快,无法在没有缓存的情况下在频繁调用的页面上使用它。

    【讨论】:

      【解决方案2】:

      【讨论】:

      • ...然后不要使用它们。它们通常弊大于利,除非您是那种能够阅读查询计划并完全理解每个图标实际作用的类型。如果优化器没有选择该索引,这通常是有充分理由的。
      猜你喜欢
      • 1970-01-01
      • 2013-06-30
      • 2015-08-29
      • 2017-05-22
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多