【发布时间】:2013-08-15 11:46:06
【问题描述】:
我有一个简单的“事物”数据库,可以有零个或多个“类别”或“标签”。我编写了一个存储过程,它将获取给定类别中的前 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) 更聪明的方法吗?根据this suggestion,id 字段已编入索引,但索引并没有多大帮助,因为它必须检查tags 表中things 中的每一行。
我正在考虑实现分页,我知道LIMIT ?,?(或LIMIT ? OFFSET ?)会很容易,但是最好向用户展示至少有多少总“匹配”的近似值.
【问题讨论】:
-
我想我只是计算了太多该死的结果。我希望“###### 的结果 1 - 20”能够与实际结果一样快地返回,但总数比我向用户展示的微小子集大几个数量级。我认为简单的性能调整/索引构建不会让我到达那里。我想我需要估计(也许有代表性的抽样?)或者将计数存储在其他地方。如果我说该表只获得不频繁的顺序插入,它会改变游戏规则吗?
标签: mysql innodb query-performance