我有一个问题:
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 回答
我没有评论的意见,所以我发布这个答案......
您是否尝试使用EXPLAIN查看
something
上的索引是否实际被使用?听起来这个查询正在做Table Scan . 理想情况下,您会希望看到类似“Extra:使用where;使用索引”的内容 .出于好奇,
something
是一个可以为空的领域?顺便说一句,也许查询优化器可以通过以下方式做得更好:
可能有助于更好地利用 Value 范围限制 .
另一件事可能是更新触发器计数 .