gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:34:17 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com