这是一个非常简单的问题,我假设答案是“没关系”,但我还是要问...
我有一个用 PHP 构建的通用 sql 语句:
$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
假设之前的有效性检查($object_ids
是一个包含至少 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) . ')';
}
或者检查 count($object_ids)
的开销是否不值得保存在实际的 sql 语句中(如果有的话)?
最佳答案
大多数其他答案都没有提供任何结论性的信息,只是猜测。所以,基于 good advice from @Namphibian's answer ,我对一些类似于 OP 中的查询运行了 EXPLAIN
。
结果如下:
EXPLAIN
用于 = 1
的查询:
EXPLAIN
用于带有 IN(1)
的查询:
EXPLAIN
用于带有 IN(1,2,3)
的查询:
如您所见,MySQL 在此类查询中确实优化了 IN(1)
与 = 1
相同。 @mes's answer然而,似乎表明对于更复杂的查询可能并非总是如此。
所以,对于那些懒得自己运行 EXPLAIN
的人来说,现在你知道了。是的,您可能希望在自己的查询上运行 EXPLAIN
以确保以这种方式处理它。 :-)
关于php - MySQL 性能 - 单个值的 "IN"子句与等于 (=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926433/