• 统计总行数你还在用比count(*) ?
  • 发布于 2个月前
  • 391 热度
    0 评论
我们经常有这样的需求,校验某张表在某个条件下是否有数据?正常的思路,肯定是用count,但其实用count未必是最高效的,不说废话,我们直接来看两种写法。

方案1:必填字段+limit 1
Select sId  From tableA limit 1; 
sId是非空字段,结合limit 1,如果有的话,就代表数据集非空。
优点:
如果表中有数据,它只检索一行,因此可能更快(特别是当表非常大时)。如果你只需要知道表是否有数据,而不需要确切的行数,那么这种方法可能足够。

缺点:
如果表中没有数据,你将得到一个 NULL 值,但无法确定是因为表中确实没有数据,还是因为 sId 字段本身就是 NULL。 所以,用这种方法,必须要保证查询的字段非空。

方案2:传统count
Select count(*) From tableA; 
传统count,查询总条数,>0的话就代表数据集非空。这种写法会返回表中的行数。然后你可以检查返回的行数是否大于0来判断表中是否有数据。

优点:
结果明确:如果返回的行数大于0,那么表中有数据;如果返回的行数为0,那么表为空。不依赖于表中特定字段的值(如 sId是否为 NULL)。

缺点:
如果表非常大,计算行数可能会比较慢,因为 COUNT(*) 需要扫描整个表(尽管某些数据库可能使用优化来快速返回结果)。

方案评析
如果你只关心表是否有数据,并且不需要知道确切的行数,那么使用 LIMIT 1 方法可能更快,特别是当表很大时。如果你需要知道确切的行数,或者想确保无论表中字段的值如何都能准确判断是否有数据,那么使用 COUNT(*) 方法更好。
用户评论