SQL IN子句比单个查询慢

Ste*_*Kuo 4 mysql sql performance hibernate jpa

我在MySQL 5.0.67中使用Hibernate的JPA实现.MySQL配置为使用InnoDB.

在执行JPA查询(转换为SQL)时,我发现使用该IN子句比执行单个查询要慢.例:

SELECT p FROM Person p WHERE p.name IN ('Joe', 'Jane', 'Bob', 'Alice')
Run Code Online (Sandbox Code Playgroud)

比四个单独的查询慢:

SELECT p FROM Person p WHERE p.name = 'Joe'
SELECT p FROM Person p WHERE p.name = 'Jane'
SELECT p FROM Person p WHERE p.name = 'Bob'
SELECT p FROM Person p WHERE p.name = 'Alice'
Run Code Online (Sandbox Code Playgroud)

为什么是这样?这是MySQL的性能限制吗?

Bil*_*win 11

这是MySQL的一个已知缺陷.

通常情况下,使用UNION比您显示的范围查询更好的表现.对于使用表达式,MySQL不会非常智能地使用索引IN (...).优化器中存在类似的漏洞,用于布尔表达式OR.

有关一些说明和详细的基准测试,请参阅http://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/.

优化器一直在不断改进.在后续版本中,可以改进一个版本的MySQL的缺陷.因此值得在不同版本上测试您的查询.

使用UNION ALL而不是简单地使用也是有利的UNION.两个查询都使用临时表来存储结果,但区别在于UNION应用于DISTINCT结果集,这会导致额外的非索引排序.