flu*_*ngo 11 mysql sql performance
这是一个关于效率的简单问题,与MySQL实现有关.我想检查一个表是否为空(如果它是空的,则使用默认数据填充它).是否最好使用类似的语句SELECT COUNT(*) FROM `table`,然后比较为0,或者更好的做一个语句,SELECT `id` FROM `table` LIMIT 0,1然后检查是否返回任何结果(结果集有下一个)?
虽然我需要这个用于我正在研究的项目,但我也对MySQL如何处理这两个语句感兴趣,以及人们似乎建议使用的原因COUNT(*)是因为结果是缓存的,还是它实际上是通过每一行并添加到这在我看来是直观的.
最好是做第二种方法或者只是exists。具体来说,类似于:
if exists (select id from table)
Run Code Online (Sandbox Code Playgroud)
应该是做你想做的最快的方式。你不需要limit; SQL 引擎会为您处理这些。
顺便说一句,永远不要将标识符(表名和列名)放在单引号中。
您绝对应该使用第二个查询而不是第一个查询。
使用时COUNT(*),MySQL至少扫描一个索引并计数记录。即使您将调用包装在LEAST()(SELECT LEAST(COUNT(*), 1) FROM table;)或中IF(),MySQL也会COUNT()在进一步评估之前进行全面评估。我不相信COUNT(*)使用InnoDB时MySQL会缓存结果。
您的第二个查询导致仅读取一行,此外,还使用了索引(假设id是其中的一部分)。查看驱动程序的文档,以了解如何检查是否已返回任何行。顺便说一下,id查询中可以省略该字段(MySQL将使用任意索引):
SELECT 1 FROM table LIMIT 1;
Run Code Online (Sandbox Code Playgroud)
但是,我认为最简单,最有效的解决方案如下(如戈登的回答所示):
SELECT EXISTS (SELECT 1 FROM table);
Run Code Online (Sandbox Code Playgroud)
EXISTS返回1如果子查询返回任何行,否则0。由于这种语义,MySQL可以适当地优化执行。子查询中列出的任何字段都会被忽略,因此1或*通常被写入。
有关关键字及其用法的更多信息,请参见MySQL手册EXISTS。