mysql - 如何在不索引更多字段的情况下提高计数性能?

标签 mysql sql database indexing

表中有超过200万条记录。

我想统计表中有多少错误(有checked),有多少已经checked。

我做了两个查询:

SELECT count(*) as CountError FROM table WHERE checked = 1 AND error != ''

-

SELECT count(*) as Checked FROM table WHERE checked = 1

性能真的很慢,大约需要 5 分钟才能得到结果。如何改进?

我已经在 status 字段上有了 UPDATE 性能的索引。

如果我在 checked 字段上建立索引 - 那么更新性能将受到影响,这是我不希望的。

UPDATE 发生的次数多于 SELECT。

表是 Innob

最佳答案

您可以尝试在同一查询中同时计算这两项是否更快:

select
  count(*) as CountError,
  sum(case when error != '' then 1 else 0 end) as Checked
from table
where checked = 1

但是,差异可能不会有太多可谈的。如果你真的想要不同,那么你需要添加一个索引。考虑影响的真正含义,并进行实际测试以了解影响的真正含义。如果更新速度慢 10% 而选择速度提高 100000%,那么它可能仍然值得。

关于mysql - 如何在不索引更多字段的情况下提高计数性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9367493/

相关文章:

php - 单击提交按钮后重定向到另一个页面并传递变量

MySQL表排名将第一行排名为0而不是1

sql - 如何使用 SQL 从每个组中获得最高得分球员?

mysql - 从文件或大数据库中读取

sql - 在 MySQL 中,如何将一张表的内容复制到同一个数据库中的另一张表中?

php - 选择字段包含可能值的数据

php - 使用 PHP 对 XML 进行 UTF-16 编码(我一直在使用 UTF-8)

SQL Server : most commonly used data types?

php - SQL 中 strtotime 相当于什么?

mysql - Amazon AWS RDS 实例组织