PHP Mysqli - 结果为0时选择*或选择计数(*)?
Posted
技术标签:
【中文标题】PHP Mysqli - 结果为0时选择*或选择计数(*)?【英文标题】:PHP Mysqli - SELECT * or SELECT COUNT(*) when result is 0? 【发布时间】:2016-11-30 09:18:42 【问题描述】:当找不到行时,SELECT *
和 SELECT COUNT(*)
之间的性能有什么区别吗?
我的聊天脚本每秒检查一次是否有新消息,因此最好知道我是否需要 count(*)
什么对服务器来说更快更好:
$result = mysqli_query($con, "blablabla");
if(mysqli_num_rows($result) > 0)
或
$result = mysqli_query($con, "blablabla");
$menge = mysqli_fetch_row($result);
$menge = $menge[0];
if($menge > 0)
什么时候找不到行?!我问的是 AJAX 聊天,大多数时候不会有新行。
【问题讨论】:
当您没有行时,SELECT *
将不返回任何内容,SELECT COUNT(*)
将 count 并返回 0。您可以通过简单地运行查询来检查自己你的数据库
如果您进行计数并且结果不是 0,那么您可能需要再次选择以获取行。
SELECT *
将整行放入结果中,但 SELECT COUNT(*)
仅在每次匹配时增加计数器。所以如果你需要计数使用SELECT COUNT(*)
,你会随着时间的推移保存为内存
@AnneSchwarz 好吧,如果您运行它们,您还会注意到查询之间的任何性能差异。另外:没有行时的任何差异都可以忽略不计,尤其是与第二个相比。您在这里完全错误的位置进行了优化。你应该担心当有 are 行时会发生这种情况(或者你不必检查),在这种情况下 明显 只检索一个number 比检索所有数据要快。
@AnneSchwarz - 使用基本查询,两者之间的时间差可以忽略不计(在自然变化范围内)。对于复杂的查询,可能存在显着差异,因为您可以简化查询(例如,如果完整查询需要子查询来获取分组集的最新详细信息,而计数可能只对是否有一行)。
【参考方案1】:
对于基本查询,两者之间的时间差可以忽略不计(在重复执行查询时完全在自然变化范围内)。对于复杂的查询,可能会存在显着差异,因为您可以使用简化查询。
例如,如果完整查询需要子查询来获取分组集的最新详细信息,那么这可能会使完整查询变得非常慢。但是,计数可能只对是否存在一行感兴趣(而不是最新行的详细信息),因此不需要子查询。这可能会产生重大影响。
假设您在 id 上有一个索引,并且您使用的值等于或接近最大值(即,您不希望返回完整的 1m 记录,而是从最后几秒返回几个最大值)然后我不认为返回的数据量会导致显着差异。
最大的持续性能损失是建立与 MySQL 的连接,以及数据库对查询的基本处理(即处理请求。不执行查询)。这些为任何查询提供了相当恒定的开销,对于一个执行后很快的简单查询来说,这是一个相当大的开销。因此,有时(当添加了新行时)执行 2 次查询的开销可能会使仅获取计数所节省的可忽略不计的成本相形见绌,除非有新记录。
【讨论】:
以上是关于PHP Mysqli - 结果为0时选择*或选择计数(*)?的主要内容,如果未能解决你的问题,请参考以下文章
面向OOP类的PHP MySQLI面向对象查询,不将查询响应计为对象[重复]