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

Jud*_*man 34 php mysql performance

这是一个非常简单的问题,我假设答案是"无所谓",但无论如何我都要问...

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

$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
Run Code Online (Sandbox Code Playgroud)

假设先前的有效性检查($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) . ')';
}
Run Code Online (Sandbox Code Playgroud)

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

J.D*_*.D. 48

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

结果如下:


EXPLAIN用于查询= 1:

使用<code>EXPLAIN</code>用于查询<code>IN(1)</code>:</p>

<p><a rel=使用<code>EXPLAIN</code>用于查询<code>IN(1,2,3)</code>:</p>

<p><a rel=使用<code>IN(1)</code>与<code>= 1</code>此类查询相同.<a href=@ mes的答案似乎表明,对于更复杂的查询,情况可能并非总是如此.

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


Kon*_*rak 23

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

  • 你能提出一些MySQL官方信息来确认你的断言吗?您是否完全确定MySQL优化器会如您解释的那样对其进行转换? (4认同)
  • 事实并非如此,我使用explain语句运行查询并发布截图作为答案 (2认同)

mel*_*okb 16

在大范围的事情中,它们都不重要.与数据库通信的网络延迟将远远超过count($object_ids)开销或=vs IN开销.我称之为过早优化的情况.

您应该对应用程序进行概要分析和加载测试,以了解真正的瓶颈所在.

  • 这并没有真正回答问题!! (2认同)

Nam*_*ian 8

使用explain语句运行这两个查询.这将向您展示MySQL正在做什么.你专注于MySQL优化应该是MySQL内部的查询.尝试优化执行哪个查询有点为时过早.

如果没有例如索引,这两个查询的性能都可能很差.MySQL的EXPLAIN语句在这里是黄金.因此,当您进入运行缓慢的查询时,EXPLAIN语句将显示原因.