Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在不索引更多字段的情况下提高计数性能?_Mysql_Sql_Database_Indexing - Fatal编程技术网

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

Mysql 如何在不索引更多字段的情况下提高计数性能?,mysql,sql,database,indexing,Mysql,Sql,Database,Indexing,表中有超过200万条记录 我想计算表中有多少错误(已选中)以及有多少错误已被选中 我有两个问题: SELECT count(*) as CountError FROM table WHERE checked = 1 AND error != '' - 性能非常慢,大约需要5分钟才能得到结果。如何改进这一点 我已经在更新性能的状态字段上建立了索引 如果我在选中的字段上建立索引,那么更新性能将受到影响,我不希望这样 更新发生的次数多于选择 表是Innob这里的问题很简单,您的选中字段是1或0,这意

表中有超过200万条记录

我想计算表中有多少错误(已选中)以及有多少错误已被选中

我有两个问题:

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

性能非常慢,大约需要5分钟才能得到结果。如何改进这一点

我已经在更新性能的
状态
字段上建立了索引

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

更新发生的次数多于选择


表是Innob

这里的问题很简单,您的选中字段是1或0,这意味着MySQL需要进行表扫描,即使您有一个键,因为它无法有效地确定0和1之间的拆分位置,尤其是在大量行上

我提供的主要建议是您不想要的,即索引checked,然后选择SUM(checked)as checked FROM table,其中checked=1将能够使用索引,而无需点击表格

但最终,这不是一个微不足道的问题。您可能希望了解一些归档计数的方法。如果您有日期或时间戳,那么您可以每天设置一个任务,该任务可以存储前一天的计数(*)。这反过来会减少需要动态解析的行数


如果没有关于此表的确切用途的进一步信息,以及不允许在该列上建立索引的原因等,则很难提出比上述方法更有用的建议。

如果在同一查询中进行两个计数更快,则可以尝试:

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

然而,差别可能不会太大。如果你真的想有所不同,那么你需要添加一个索引。考虑一下这种影响到底意味着什么,并做一个实际的测试来了解这种影响到底是什么。如果更新速度慢了10%,选择速度快了100000%,那么它仍然是值得的。

购买更多硬件。不,真的-你不可能白手起家,所以如果你不想做出权衡,你需要改变问题的约束条件。使用
memcache
,或更快的机器,或升级数据库软件……这是一个非常基本的查询。如果不索引
已选中
错误
,您将无能为力@Borealid好的,除了买更多的硬件什么都没有…如果添加索引节省的资源大于添加索引的资源成本,请添加索引。通常,您会发现添加索引的好处大于成本。除非你能量化没有整体节省,否则我通常会错误地添加所需内容,而不是过度“担心”对更新的影响。据我所知,第二个聚合在MySQL中可能更简单:
SUM(error!='')As Checked
(在本例中布尔值隐式转换为整数:
false
->
0
true
->
1
)。是的,确切地说,如果索引没有足够的选择性,则索引是无用的。它们仍然可以有有限的用途,但仅从索引可用于需要有限列的情况的角度来看。不过,在大多数情况下,与范围更大的索引(即日期范围)相比,它们的改进很少。日期范围是指在覆盖索引比表扫描更有效
select
  count(*) as CountError,
  sum(case when error != '' then 1 else 0 end) as Checked
from table
where checked = 1