MySQL 性能 - 单个值的“IN”子句与等于 (=)

2022-08-30 11:36:04

这是一个非常简单的问题,我假设答案是“没关系”,但我无论如何都要问......

我有一个用PHP构建的通用sql语句:

$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';

假设事先进行有效性检查(是一个至少包含1个项目和所有数值的数组),我是否应该执行以下操作?$object_ids

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) . ')';
}

或者检查的开销不值得在实际的sql语句中保存的内容(如果有的话)?count($object_ids)


答案 1

大多数其他答案都没有提供任何结论,只是猜测。因此,根据@Namphibian的答案中的良好建议,我对一些类似于OP中的查询进行了查询。EXPLAIN

结果如下:


EXPLAIN对于具有以下条件的查询:= 1

Explain for a query with <code>= 1</code>


EXPLAIN对于具有以下条件的查询:IN(1)

Explain for a query with <code>IN(1)</code>


EXPLAIN对于具有以下条件的查询:IN(1,2,3)

Explain for a query with <code>IN(1,2,3)</code>


如您所见,MySQL确实进行了优化,使其与此类查询相同。然而,@mes的答案似乎表明,对于更复杂的查询,情况可能并不总是如此。IN(1)= 1

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


答案 2

MySQL 语句之间没有区别,当 IN 只是一个元素时,MySQL 优化器会将 IN 转换为 = 。不要打扰。


推荐