Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL性能-“;在;单个值的子句vs.Equals(=)_Php_Mysql_Performance - Fatal编程技术网

Php MySQL性能-“;在;单个值的子句vs.Equals(=)

Php MySQL性能-“;在;单个值的子句vs.Equals(=),php,mysql,performance,Php,Mysql,Performance,这是一个非常简单的问题,我假设答案是“没关系”,但我还是要问 我在PHP中构建了一个通用sql语句: $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')'; 假设先前的有效性检查($object\u id是一个至少包含1项和所有数值的数组),我是否应该改为执行以下操作 if(count($object_ids) == 1) { $sql = 'SELECT * FROM `use

这是一个非常简单的问题,我假设答案是“没关系”,但我还是要问

我在PHP中构建了一个通用sql语句:

$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
假设先前的有效性检查(
$object\u id
是一个至少包含1项和所有数值的数组),我是否应该改为执行以下操作

if(count($object_ids) == 1) {
    $sql = 'SELECT * FROM `users` WHERE `id` = ' . array_shift($object_ids);
} else {
    $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
}

或者检查
计数($object\u id)
的开销是否不值得保存在实际的sql语句中(如果有的话)?

它们在很大范围内都不重要。与数据库通信的网络延迟将远远超过
计数($object\u id)
开销或
开销中的
=
vs
。我称之为过早优化


您应该对应用程序进行概要分析和负载测试,以了解真正的瓶颈在哪里。

MySQL语句之间没有区别,MySQL Optimizer会将IN转换为=当IN只是一个元素时。不用麻烦。

我想mysql内部会将(6)
中的
查询完全视为
=6
查询,因此无需麻烦(顺便说一下,这称为过早优化)

使用explain语句运行这两个查询。这将向您展示MySQL正在做什么。您关注的是MySQL优化应该是MySQL在内部如何处理查询。试图优化执行哪个查询有点为时过早


例如,如果没有索引,这两个查询的性能都可能很差。MySQL的解释语句在这里很有用。因此,当您遇到运行缓慢的查询时,EXPLAIN语句将向您说明原因

我使用explain语句运行查询,下面是结果


很明显,“Equals”运算符更好,它扫描13行,“IN”扫描所有行

大多数其他答案都没有提供任何结论,只是猜测而已。因此,基于,我对一些类似于OP中的查询运行了一个
EXPLAIN

结果如下:


解释
对于
=1的查询:


解释(1)
中带有
的查询:


EXPLAIN
对于在(1,2,3)
中使用
的查询:


如您所见,MySQL在(1)
中对
进行了优化,使其与此类查询中的
=1
相同。但是,这似乎表明,对于更复杂的查询,情况可能并不总是如此


所以,对于那些懒得自己运行
解释
的人,现在你知道了。是的,您可能希望在自己的查询上运行
解释
,以确保它是以这种方式处理的。:-)

你回答了你的问题:)没关系。使用
内爆
也更容易,无需检查数组的大小。@N.B.有人告诉过你你的名字很适合评论吗:P@mellamokb-现在有人这样做了:)@N.B.我想那应该是caseSELECT*从用户u内部加入(选择1作为id联合选择11作为id联合选择21作为id)t2 ON u.id=t2.id您能提供一些MySQL官方信息来确认您的断言吗?你完全确定MySQL optimizer会像你解释的那样对其进行转换吗?这不是真的,我使用explain语句运行查询,并将屏幕截图作为答案发布。你的查询有一个子查询,因此它不一定表示在
中对一项进行了优化。这并没有真正回答问题!!