首页 文章

Mysql数量上限(*)

提问于
浏览
7

我有一个问题:

select count(*) from `table` where `something`>123

如果表有几百万条记录,即使列 something 上有索引,查询也会运行得很慢 . 但是,事实上我对以下 Value 感兴趣:

min(100000, count(*))

那么有什么方法可以防止MySQL在已经找到100k时对行进行计数?我找到了类似的东西:

select count(*) from (select 1 from `table` where `something`>123 limit 100000) as `asd`

如果表有几百万个匹配条目,它比 count(*) 快得多,但当少于100000个匹配时 count(*) 运行得快得多 .

有没有办法更快地做到这一点?

2 回答

  • 1

    我没有评论的意见,所以我发布这个答案......

    • 您是否尝试使用EXPLAIN查看 something 上的索引是否实际被使用?听起来这个查询正在做Table Scan . 理想情况下,您会希望看到类似“Extra:使用where;使用索引”的内容 .

    • 出于好奇, something 是一个可以为空的领域?

    顺便说一句,也许查询优化器可以通过以下方式做得更好:

    select count(*) as cnt
    from table
    where something > 123
    having count(*) > 100000
    
  • 0

    可能有助于更好地利用 Value 范围限制 .

    select count(*) - (select count(*) from t where something <= 123) as cnt
    from t
    

    另一件事可能是更新触发器计数 .

相关问题