我有一个简单的“事物”数据库,其中可以包含零个或多个“类别”或“标签”。我编写了一个存储过程,该过程将获取给定类别中的前N个对象,并且性能非常好。看起来像

SELECT * FROM things
WHERE things.datestamp > @start AND things.datestamp < @end
  AND EXISTS (
    SELECT 1 from thing_tags
    WHERE things.id = thing_tags.thing_id
      AND thing_tags.tag = @searchTag
  )
LIMIT ?


有了几十万个“事物”,每个事物都带有大约0-5个标签,性能就很好-我最多可以在几十毫秒内获得前几百个匹配项。

但是,如果我想知道总共有多少场比赛,那会花很多时间-至少要花几秒钟。有没有比SELECT COUNT(id) FROM .... (rest of query above)更聪明的方法? id字段是按this suggestion进行索引的,但是该索引的作用不大,因为它必须为tags中的每一行检查things表。

我正在考虑实现分页,并且我知道LIMIT ?,?(或LIMIT ? OFFSET ?)会很容易,但是最好向用户显示至少大约期望的总“匹配数”的近似值。

最佳答案

我认为以下内容应有所作为

SELECT count(id) FROM things, things_tags
WHERE things.datestamp > @start AND things.datestamp < @end
  AND things.id=thing_tags.thing_id
  AND things_tags.tag = @searchTag
  GROUP BY things.id


在(datestamp,id)的事物和(id,tag)的thing_tags上具有索引。
我在这里假设每个事物的标签都是不同的。

关于mysql - 估计MySQL“SELECT WHERE EXISTS”查询的结果数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18252021/

10-11 01:54
查看更多