我自己对此很好奇。阅读文档和理论答案都很好,但是我想在经验和证据之间取得平衡。
我有一个MySQL表(InnoDB),其中有5,607,997条记录。该表位于我自己的专用沙箱中,因此我知道内容是静态的,没有其他人在使用服务器。我认为这有效地消除了所有对性能的影响。我有一个带有auto_increment主键字段(Id)的表,我知道该表永远不会为空,将用于我的where子句测试(WHERE ID不为NULL)。
我在运行测试中看到的唯一其他可能的故障是缓存。第一次运行查询总是比使用相同索引的后续查询慢。我在下面将其称为“缓存种子”调用。只是将其混为一谈,我使用where子句运行了该子句,我知道无论任何数据(TRUE = TRUE),该子句都将始终为true。
那就是我的结果:
查询类型
| w/o WHERE | where id is not null | where true=true
计数()
| 9 min 30.13 sec ++ | 6 min 16.68 sec ++ | 2 min 21.80 sec ++
| 6 min 13.34 sec | 1 min 36.02 sec | 2 min 0.11 sec
| 6 min 10.06 se | 1 min 33.47 sec | 1 min 50.54 sec
COUNT(编号)
| 5 min 59.87 sec | 1 min 34.47 sec | 2 min 3.96 sec
| 5 min 44.95 sec | 1 min 13.09 sec | 2 min 6.48 sec
COUNT(1)
| 6 min 49.64 sec | 2 min 0.80 sec | 2 min 11.64 sec
| 6 min 31.64 sec | 1 min 41.19 sec | 1 min 43.51 sec
++这被视为缓存种子调用。预计它会比其余的慢。
我会说结果说明一切。COUNT(Id)通常会淘汰其他的。即使添加了Where子句,即使您知道该子句的评估结果为true,它也会大大减少访问时间。最有效的点似乎是COUNT(Id)... WHERE Id NOT NULL。
我希望看到其他人的结果,也许使用较小的表,或者使用针对不同字段的where子句而不是您要计算的字段。我敢肯定,我还没有考虑其他变化。