MySQL临时表vs where子句

时间:2017-10-31 09:13:03

标签: mysql sql mariadb

问题是这样的。

我需要从列*所在的User列中phoneNumber获取phoneNumberArray。大约有300到1000个电话号码。表User在phoneNumber上有一个索引,可能包含数百万行。

创建临时表格UserphoneNumbers并插入所有电话号码并执行JOIN或使用简单的WHERE IN并传递1000个电话号码的数组会不会更好?< / p>

2 个答案:

答案 0 :(得分:1)

我认为第一种方法更易读,更便于维护。

如果有一天你想从临时表切换到持久表,那将会更容易。

关于效果,已经有topic about it

  

我怀疑如果你在WHERE子句中这样做,计划者就会选择   更有效的路线(即基于指数或前期   过滤数据集)。

     

你可能会使加入工作速度快(如果不是更快)   在两列上添加索引(不确定是否包含列和   Postgres上还支持多列索引。

答案 1 :(得分:1)

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

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

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

使用IN - 特别是在MySQL中 - 是一个合理的选择。 MySQL命令常量IN列表并使用二进制搜索来匹配值。这对于全表扫描最有利。使用那么大的列表,全表扫描可能是最有效的方法。

就个人而言,我会从IN列表开始。使用包含1,000个元素的IN列表生成查询与具有3个元素的列表具有相同的代码复杂性。如果这不符合您的需求,请使用临时表尝试性能。如果它运作得更好,那么就采用这种方法。