MySQL中的IN(42)和id = 42之间的性能差异是什么?
作者:互联网
两者之间是否有任何性能差异
SELECT *
FROM table
WHERE id IN (42);
和
SELECT *
FROM table
WHERE id = 42;
?
问题是只提供单一价值.对我来说,自然的假设是优化器会将它们视为相等,并在获取数据时执行相同的优化.但这是对的吗?
解决方法:
查询是否相同取决于MySQL查询优化器.为什么?
2013年3月13日,我写了这篇文章的答案:Is there an execution difference between a JOIN condition and a WHERE condition?
在那篇文章中,我详细描述了JOIN的执行方式.以下摘自page 172 of Understanding MySQL Internals引用的帖子:
>确定可以使用哪些密钥从表中检索记录,并为每个表选择最佳密钥.
>对于每个表,确定表扫描是否比读取密钥更好.如果有许多记录与键值匹配,则键的优点会减少,表扫描会变得更快.
>确定查询中存在多个表时应加入表的顺序.
>重写WHERE子句以消除死代码,减少不必要的计算并尽可能地改变约束以打开使用键的方式.
>从连接中消除未使用的表.
>确定键是否可用于ORDER BY和GROUP BY.
>尝试简化子查询,并确定可以缓存其结果的程度.
>合并视图(将视图引用展开为宏)
在同一页面上,它说明如下:
In MySQL optimizer terminology, every query is a set of joins. The term join is used here more broadly than in SQL commands. A query on only one table is a degenerate join. While we normally do not think of reading records from one table as a join, the same structures and algorithms used with conventional joins work perfectly to resolve the query with only one table.
根据上述信息,无论具有多个表或仅包含一个表的事件的查询,JOIN行为都将执行相同的操作.
您的原始问题
在幕后,MySQL将以相同的方式评估这两个查询.如果你想要更好的查询性能,你必须采取牛角.您应该尽可能地对表进行操作,以便MySQL连接行为尽可能顺利.
>添加所需的索引
>增加会话级缓冲区(sort_buffer_size,join_buffer_size)
>利用存储引擎机制来调整数据和索引
>重构查询
如果你看一下dimitar’s answer,现在它说明了MySQL的连接行为进行测试的情况.而不是押注你拥有的两匹马(你的查询),看看谁跑得更好,如果这样的马存在,就花时间去获得更快的马.
从ditimar的帖子中,你有这些
> SELECT * FROM表WHERE id IN(42,43,44,45);
> SELECT * FROM表WHERE id = 42或id = 43或id = 44或id = 45;
这是我为了举例而建议的另一个
SELECT A.* FROM table A INNER JOIN
(SELECT 42 id UNION SELECT 43 UNION SELECT 44 UNION SELECT 45) B
USING (id);
和另一个
SELECT * FROM table WHERE id = 42
UNION
SELECT * FROM table WHERE id = 43
UNION
SELECT * FROM table WHERE id = 44
UNION
SELECT * FROM table WHERE id = 45;
我可以弥补其他可能性,但这里的主要想法是尝试第一次写出好的查询.当您的数据量增长时,您的最佳查询可能会受到密钥分发和陈旧索引统计信息的影响,这可能需要优化表格甚至重写查询以适应更大的数据.
标签:query-performance,performance,mysql 来源: https://codeday.me/bug/20190806/1601508.html