MySQL临时表vs where in子句

MySQL临时表vs where in子句,mysql,sql,mariadb,Mysql,Sql,Mariadb,问题是这样的 我需要从User表中获取*,其中phoneNumber列位于phonenumeraray中。大约有300到1000个电话号码。表User有一个关于phoneNumber的索引,可以包含数百万行 创建一个临时表UserphoneNumbers并插入所有电话号码,然后执行一个JOIN或使用一个简单的WHERE IN并传递一个包含1000个电话号码的数组是否更好?我认为第一种方法更清晰,更便于维护 如果有一天您想从临时表切换到持久表,这会更容易 关于性能,已经有了: 我怀疑,如果你在WH

问题是这样的

我需要从
User
表中获取
*
,其中
phoneNumber
列位于
phonenumeraray
中。大约有300到1000个电话号码。表
User
有一个关于phoneNumber的索引,可以包含数百万行


创建一个临时表
UserphoneNumbers
并插入所有电话号码,然后执行一个
JOIN
或使用一个简单的
WHERE IN
并传递一个包含1000个电话号码的数组是否更好?

我认为第一种方法更清晰,更便于维护

如果有一天您想从临时表切换到持久表,这会更容易

关于性能,已经有了:

我怀疑,如果你在WHERE条款中这样做,规划者就是在选择 更高效的路由(即基于索引的路由或预路由) 过滤数据集)

您可以通过以下方式使联接工作得同样快(如果不是更快的话) 在两列上添加索引(不确定是否包含列和 Postgres上还支持多列索引)


这是一个有趣的问题。使用第二种方法有很多参数——将值放入数组

使用临时表并不是一个不合理的选择,但它会给应用程序增加很大的复杂性。它增加了数据库的读写开销。应用程序必须创建表并加载它(数据库将负责删除它)

如果您确实认为需要此选项,请确保电话号码是表中的主键。这对性能来说是最佳的

在中使用
——特别是在MySQL中——是一个合理的选择。MySQL在
列表中排序常量
,并使用二进制搜索匹配值。这对全表扫描最为有利。对于如此大的列表,完整表扫描可能是最有效的方法


就我个人而言,我会从
列表中的
开始。在
列表中生成包含1000个元素的
查询与包含3个元素的列表的代码复杂度相同。如果这不能满足您的需要,那么使用临时表来测试性能。如果效果更好,那么就采用这种方法。

尝试这两种方法,看看执行计划和统计数据,我想使用临时表会更昂贵,因为它会构建和填充临时表。请给我们看一个查询,一些数据,或者两者都有?如果您的查询频率较低且电话号码列表是静态的,则最好为电话号码创建一个临时表。但是如果电话号码列表是动态的,最好使用WHERE IN来减少表的创建和删除时间。我基本上只创建表查询一次,然后删除它。我只会在创建新帐户时执行此操作。我将尝试这两种方法,并测试结果
,其中(…)
意味着您需要按任意数量查找“用户”。这似乎是一个不太可能的用例。谢谢你的回答。关于这个主题有好几篇帖子,但是你总是会在最后讨论引擎是否会进行优化。由于许多答案都是多年前的,很难知道引擎在2017年会做什么。你说得对,但我处理的数据量非常大(数十亿),两种方法在性能方面的差异并不显著。因此,我认为正确的方法是你在易读性方面更喜欢的方法。