mysql - 检查MySQL表是否为空: COUNT(*) is zero vs. LIMIT(0,1)有结果?

标签 mysql sql performance

这是一个关于效率的简单问题,具体与 MySQL 实现有关。我只想检查一个表是否为空(如果为空,则用默认数据填充它)。最好使用像 SELECT COUNT(*) FROM `table` 这样的语句然后与 0 比较,还是像 SELECT `id` FROM ` 这样的语句更好table` LIMIT 0,1 然后检查是否返回了任何结果(结果集有下一个)?

虽然我正在从事的项目需要这个,但我也对 MySQL 如何处理这两个语句以及人们似乎建议使用 COUNT(*) 的原因是否是因为结果是否被缓存,或者它是否真的遍历每一行并添加到一个计数中,就像我直观地看到的那样。

最佳答案

您绝对应该使用第二个查询而不是第一个。

当使用 COUNT(*) 时,MySQL 正在扫描至少一个索引并计算记录。即使您将调用包装在 LEAST() (SELECT LEAST(COUNT(*), 1) FROM table;) 或 IF(),MySQL 将在进一步评估之前完全评估 COUNT()。我不相信 MySQL 在使用 InnoDB 时会缓存 COUNT(*) 结果。

您的第二个查询导致仅读取一行,此外还使用了索引(假设 id 是其中的一部分)。查看驱动程序的文档以了解如何检查是否已返回任何行。 顺便说一句,id 字段可能会从查询中省略(MySQL 将使用任意索引):

SELECT 1 FROM table LIMIT 1;

但是,我认为最简单和最高效的解决方案如下(如 Gordon 的回答所示):

SELECT EXISTS (SELECT 1 FROM table);
如果子查询返回 any 行,则

EXISTS 返回 1,否则返回 0。由于这种语义,MySQL 可以适本地优化执行。 子查询中列出的任何字段都将被忽略,因此通常编写 1*

MySQL Manual有关 EXISTS 关键字及其使用的更多信息。

关于mysql - 检查MySQL表是否为空: COUNT(*) is zero vs. LIMIT(0,1)有结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23063327/

相关文章:

Mysql更新,2个数据库

mysql - 如何连接同一年的行

c# - 将位值写入数据库

sql - SQL:给定日期可用的最大日期

java - 保证键唯一时 HashMap 的性能

python - mysql/python 连接器使用参数和字典在处理空值时死亡

mysql - SQL 请求无法正常工作

sql - 运行时错误: Invalid parameter 1 specified for datepart - VBA - SQL

c# - 修改appSettings时性能不佳

c++ - 有效获取字符串流的子流