问题是这样的。
我需要从列*
所在的User
列中phoneNumber
获取phoneNumberArray
。大约有300到1000个电话号码。表User
在phoneNumber上有一个索引,可能包含数百万行。
创建临时表格UserphoneNumbers
并插入所有电话号码并执行JOIN
或使用简单的WHERE IN
并传递1000个电话号码的数组会不会更好?< / p>
答案 0 :(得分:1)
我认为第一种方法更易读,更便于维护。
如果有一天你想从临时表切换到持久表,那将会更容易。
关于效果,已经有topic about it:
我怀疑如果你在WHERE子句中这样做,计划者就会选择 更有效的路线(即基于指数或前期 过滤数据集)。
你可能会使加入工作速度快(如果不是更快) 在两列上添加索引(不确定是否包含列和 Postgres上还支持多列索引。
答案 1 :(得分:1)
这是一个有趣的问题。使用第二种方法有很多参数 - 将值放在数组中。
使用临时表不是一个不合理的选择,但它增加了应用程序的复杂性。它为数据库增加了读写开销。应用程序必须创建表并加载它(数据库将负责删除它)。
如果您确实认为需要此选项,请确保电话号码是表格中的主键。这对性能来说是最佳的。
使用IN
- 特别是在MySQL中 - 是一个合理的选择。 MySQL命令常量IN
列表并使用二进制搜索来匹配值。这对于全表扫描最有利。使用那么大的列表,全表扫描可能是最有效的方法。
就个人而言,我会从IN
列表开始。使用包含1,000个元素的IN
列表生成查询与具有3个元素的列表具有相同的代码复杂性。如果这不符合您的需求,请使用临时表尝试性能。如果它运作得更好,那么就采用这种方法。