我自己对此很好奇。阅读文档和理论答案都很好,但我喜欢用经验证据来平衡这些。
我有一个 MySQL 表 (InnoDB),其中有 5,607,997 条记录。该表在我自己的私有沙箱中,所以我知道内容是静态的,没有其他人在使用服务器。我认为这有效地消除了所有外部对性能的影响。我有一个带有 auto_increment 主键字段 (Id) 的表,我知道它永远不会为空,我将用于我的 where 子句测试 (WHERE Id IS NOT NULL)。
我在运行测试中看到的唯一其他可能的故障是缓存。第一次运行查询总是比使用相同索引的后续查询慢。我将在下面将其称为缓存播种调用。只是为了把它混在一起,我用一个 where 子句运行它,我知道无论任何数据如何(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
计数(编号)
| 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
计数(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)...其中 Id 不为空。
我很想看看其他人的结果,可能是使用较小的表或针对不同字段的 where 子句而不是您计算的字段。我敢肯定还有其他我没有考虑到的变化。