目前我正在运行这两个查询:
SELECT COUNT(*) FROM `mytable`
SELECT * FROM `mytable` WHERE `id`=123
我想知道哪种格式最有效。执行查询的顺序是否有所不同?是否有一个查询能够满足我的需求?
答案 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