Mysql IN()vs UNION ALL性能

时间:2018-10-10 16:49:43

标签: mysql sql database

有人可以解释以下两个查询的性能特征的区别吗?

查询1

SELECT id FROM users WHERE status IN(1, 6, 11, 13);

查询2

(SELECT id FROM users WHERE status = 1)
UNION ALL
(SELECT id FROM users WHERE status = 6)
UNION ALL
(SELECT id FROM users WHERE status = 11)
UNION ALL
(SELECT id FROM users WHERE status = 13)

我知道查询#1对于人类来说更容易理解。

我对有关它们的性能特征如何相同或不同的讨论感兴趣。您可以假设users.status上有一个索引

3 个答案:

答案 0 :(得分:2)

在第二个查询中,您要分别查询表。对于每个select,它必须读取一个表。第一种方法是必须一次读取表格。

有了索引,性能不会有太大不同。

没有索引,读取的每个表都必须是全表扫描,并且这两种方法之间的性能差异将更大。

因此,第一次查询会更快。

答案 1 :(得分:2)

使用索引,从性能的角度来看,两者在本质上应该等效。索引可用时的基本过程是索引查找,以获取匹配的行,然后获取数据页。第一个在单个查询单元中执行了四次。第二个在一个ID上执行四个查询单元。

没有索引,第一个应该更快-如果每次都需要从磁盘读取表,则要快四倍。或者,如果表适合可用内存,并且随后的扫描使用热数据页缓存,则只能递增一些速度。

答案 2 :(得分:0)

第一个会更快。您可以通过分析来查看它:

data-my-attribute

因此,即使联合查询中使用索引的实际执行速度很快,联合查询中单独查询的开销仍然存在。