【问题标题】:Slow WHERE IN SQL query using pandas python使用 pandas python 的 SQL 查询慢
【发布时间】:2018-02-21 07:21:48
【问题描述】:

我正在尝试加快 sqlite3 查询,目前速度很慢。

我有一个约 2200 万行的表,其中包含两列(uid、info)

然后,我在 python 中找到与上表中的 uid 相对应的约 10,000 个 uid 值的列表。 (这篇文章随机生成的数字)

import numpy as np
import pandas as pd
import sqlite3

conn = sqlite3.connect('mydb.db')

uids = np.random.random(10000)
uids = list(map(int,list(map(round,uids*2000000))))

sql_query = 'SELECT * FROM mytable WHERE uid IN (' + ','.join(map(str, uids)) + ')'
sqlpd = pd.read_sql_query(sql_query,conn)

查询有效,但速度很慢(约 15 秒)。想知道如何加快速度,我猜这是导致问题的 WHERE ... IN 方法

【问题讨论】:

  • 随机想法:尝试使用您需要的 uid 创建一个临时表并使用 mytable 加入 - 如果 IN 使用具有 n 行和 m 的 O(n*m) 算法实现,这将有所帮助uids,但连接已经被优化了
  • 想法 #2:运行 10000 次选择 WHERE uid = {} - 这两个想法都可以在 O(m*log(n)) 中实现,不知道哪个更快
  • uid 列是否被索引?
  • 我还会在 SQLite 中创建一个临时表并进行连接。 IMO idea #2 将会非常缓慢...
  • uid列为主索引

标签: python sql sqlite pandas where-in


【解决方案1】:

实现@Aprillion's idea #1:

pd.DataFrame({'uid':uids}).to_sql('tmp', conn, index=False, if_exists='replace')

现在我们可以这样做了:

sql_query = 'SELECT a.* FROM mytable a JOIN tmp b ON a.uid = b.uid'
sqlpd = pd.read_sql_query(sql_query,conn)

【讨论】:

  • 试过这个解决方案,不幸的是没有改善。花费的时间与我之前的尝试几乎完全相同(约 15 秒)。
【解决方案2】:

不知道为什么,但我删除了表并使用相同的代码/数据进行了重建。现在它在 0.1 秒内运行。

问题解决了,不知道为什么:/

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2011-07-19
    • 2023-03-15
    • 2016-01-25
    相关资源
    最近更新 更多