计算表中所有行但最多只选择一行的最有效方法

时间:2009-11-16 21:05:29

标签: mysql performance count

目前我正在运行这两个查询:

SELECT COUNT(*) FROM `mytable`

SELECT * FROM `mytable` WHERE `id`=123

我想知道哪种格式最有效。执行查询的顺序是否有所不同?是否有一个查询能够满足我的需求?

4 个答案:

答案 0 :(得分:7)

两个查询都相当无关。 COUNT不使用任何索引,而SELECT可能使用主键进行快速查找。查询唯一的共同点就是表格。

由于这些非常简单,查询优化器和结果缓存不应该在这些查询上表现良好。

它们会导致性能问题吗?如果没有,请不要费心优化它们。

答案 1 :(得分:1)

  

执行查询的顺序是否有所不同?

不,他们达成了不同的目标。计数将读取包含表的列数的字段,select by id将使用索引。两者都快速而简单。

  

是否有一个查询可以执行我想要的操作?

是的,但它会使你的代码不那么清晰,维护性较差(由于混合概念),并且在最好的情况下不会改善性能(可能会使它变得更糟)。

如果你真的想以某种方式对它们进行分组,那么创建一个存储过程,但除非你在代码的很多地方或几个地方使用这对查询,否则它可能是一种过度杀伤。

答案 2 :(得分:1)

您使用的是什么表引擎?

与InnoDB相比,MyISAM上的{p> select count(*)更好。在MyISAM中,存储每个表的行数。执行count(*)时,返回值。 InnoDB没有这样做,因为它支持事务。

更多信息: http://www.mysqlperformanceblog.com/2006/12/01/count-for-innodb-tables/

答案 3 :(得分:1)

首先: Ben S。提出了一个很好的观点。这不值得优化
但如果想把这两个陈述放在一个SQl语句中,我认为这是一种方法:

select *,count(*) from mytable
union all
select *,-1 from mytable where id = 123

这将为count(*)提供一行(其中一行忽略除最后一列之外的所有行)和as尽可能多的行,其中id = 123(其中一行忽略最后一列,因为它总是-1)

像这样:

 | Column1  | Column2  | Column3  | ColumnN  | Count(*) Column |
 ---------------------------------------------------------------
 | ignore   | ignore   | ignore   | ignore   |     4711        |
 |valid data|valid data|valid data|valid data|     -1 (ignore) |

问候
Sigersted