我有一个简单的“事物”数据库,可以有零个或多个“类别”或“标签”。我已经编写了一个存储过程,它将获取给定类别中的前 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 ....(上面查询的其余部分)
更聪明的方法? id
字段已编入索引,根据 this suggestion ,但索引并没有多大帮助,因为它必须检查 things
中每一行的 tags
表。
我正在考虑实现分页,我知道 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/