这是一个关于效率的简单问题,具体与 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/