我有一个简单的“事物”数据库,其中可以包含零个或多个“类别”或“标签”。我编写了一个存储过程,该过程将获取给定类别中的前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/