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

标签 php mysql performance

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

我有一个用 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 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 在此类查询中确实优化了 IN(1)= 1 相同。 @mes's answer然而,似乎表明对于更复杂的查询可能并非总是如此。

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

关于php - MySQL 性能 - 单个值的 "IN"子句与等于 (=),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926433/

相关文章:

MySQL - 选择列 + X > 列的行

php - 如何在 PHP 中过滤数据为空或 0 的 mysql 行

php - Symfony2:调用未定义的方法 Doctrine\ORM\QueryBuilder::getResult()

php - 管理员和用户登录php mysql表单

php - 您可以在本地存储来自 twitter API 的推文吗

python - Mysql 或 python 中的数据类型转换

php - Python:如何在内部/localhost 发出 HTTP 请求

java - Python 与 Java 性能(运行时速度)

sql - 删除查询非常慢

Java 编译速度 vs Scala 编译速度