我有一个简单的“事物”数据库,可以有零个或多个“类别”或“标签”。我编写了一个存储过程,它将获取给定类别中的前 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 个标签,性能很好——我最多可以在几十毫秒内得到前几百个匹配。
但是,如果我想知道总共有多少匹配项,则需要很长时间——至少要几秒钟。有比 just 更聪明的方法SELECT COUNT(id) FROM .... (rest of query above)
吗?根据这个建议,该id
字段已编入索引,但索引并没有太大帮助,因为它必须检查表中的每一行。tags
things
我正在考虑实现分页,并且我知道LIMIT ?,?
(or LIMIT ? OFFSET ?
) 会很容易,但是最好向用户展示至少有多少总“匹配”期望的近似值。