SQL查询花费了大量时间

时间:2015-01-13 15:59:55

标签: mysql sql

我在以下查询中遇到速度问题

Select * 
from Table1 
join table2 on table1.key = table2.key
where table2.code IN ('Code1','Code2',...,'Code18') 
  and table1.accountnumber in ('account1','account2',...,'account30000')

编辑:是的,我的加入中有一个ON我道歉,因为草率并在我原来的问题中将其删除

总计300万行,18个代码和4-5个帐户大约需要8秒钟。但是,我的真实数据集大约有8000万行,并且可能有数十万个帐户。我似乎无法弄清楚如何加快速度,并希望得到一些帮助。帐号是从一个文件生成的,该文件可以有4个数字到数万个。但代码是硬编码的,永远不会改变。

1 个答案:

答案 0 :(得分:1)

好的,让我们来看看你想做什么:

  • table1key
  • 过滤accountnumber
  • table2key
  • 过滤code
  • 注意:按key进行过滤是有界限的,因为表格依赖于此列
  • 注意:其他列的过滤不会相互交叉,因此可以独立完成(例如,在key加入之前)

所以,你可以这样做:

  • 两个表中的索引key列。但是如果表格很大并且按key过滤是罕见的操作,那么这将是个坏主意。我的意思是key列上创建索引可能不好,这取决于您的数据库
  • 由于上面列表的最后一段,您可以在加入前进行过滤。因此,您可以使用预过滤数据创建临时表。
  • 由于您的in语句可能很长,因此将它存储在临时表中然后加入它而不是in是非常愚蠢的。我的意思是存储应该在code语句中的所有in,然后通过加入此临时表进行过滤。
  • 索引codeaccountnumber也是一个好主意。

总的来说,你需要测试和研究你的表和in语句有多大,哪些更好 - 在key上创建索引并按顺序执行:

  1. 之前的全局步骤:在key列上创建索引。 [不是必需的。只有在你的情况下好!]
  2. 加入key
  3. 将结果存储在临时表
  4. 在此临时表中的code / accountnumber上创建索引。 [不是必需的。只有在你的情况下好!]
  5. code / accountnumber in语句值创建临时表(在特定列上使用主键)。 [不是必需的。只有在你的情况下好!]
  6. 通过加入表
  7. code / accountnumber进行过滤

    或:

    1. 之前的全局步骤:在code / accountnumber的{​​{1}} / table列上创建索引。 [不是必需的。只有在你的情况下好!]
    2. table2 / code accountnumber语句值创建临时表(在特定列上使用主键)。 [不是必需的。只有在你的情况下好!]
    3. 通过加入成对的表格分别按in / code过滤=>两个临时表 - accountnumberfiltered_table1,其中filtered_table2列为主键
    4. key
    5. 加入

      我希望你有可能进行优化的想法。我想你还需要测试这些可能的方法。

      希望它有所帮助!