mysql - 估计 MySQL "SELECT WHERE EXISTS"查询的结果数?

标签 mysql innodb query-performance

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

相关文章:

mysql - 服务器快照可能会损坏 MySQL 事务吗?

postgresql hashaggregate查询优化

sql - 分区表上的 Postgres 查询比非分区表慢 2 倍

PHP:插入到sql中

php - 区分大小写的 PHP PDO 登录脚本

mysql - 如果 MySQL 中不存在,是否可以使用没有主键的 where-in 子句来更新或插入?

python - 在 sqlalchemy 中使用带有参数的子查询

mysql - 如何在 MySQL 查询中进行正则表达式

MySQL 5.7 - 使用 ON DUPLICATE KEY 时,回滚时死锁,但提交时不死锁

sql - 通过单次扫描对昂贵的表表达式进行多次选择