2017-09-12 3 views
1

Ich versuche, eine SQLite3 Abfrage zu beschleunigen, derzeit ist es ziemlich langsam.Langsam WHERE IN SQL-Abfrage mit Pandas Python

Ich habe eine Tabelle von ~ 22 Millionen Zeilen mit zwei Spalten (uid, info)

In Python habe ich dann eine Liste von ~ 10.000 uid Werte finden, die in der Tabelle oben zu uid des entsprechen. (zufällig erzeugte Zahlen für diesen Beitrag)

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) 

Die Abfrage funktioniert, aber es ist ziemlich langsam (~ 15 Sekunden). Sie fragen sich, wie ich das oben beschleunigen kann, ich vermute es die WHERE ist ... in der Methodik, die das Problem

+4

zufällige Idee: versuchen, eine temporäre Tabelle mit den uids Erstellen Sie brauchen und kommen Sie mit 'mytable' - es wäre für den Fall helfen, dass' IN' mit einem 'O umgesetzt wird (n * m) 'Algorithmus mit n Zeilen und M Uids, aber Join wäre bereits optimiert – Aprillion

+0

Idee # 2: run 10000 wählt' WHERE uid = {} '- beide Ideen können in 'O (m * log (n)) ', keine Idee, die schneller ist – Aprillion

+0

Ist die UID-Spalte indiziert? –

Antwort

0

Nicht sicher, warum, aber ich habe die Tabelle fallen gelassen und mit dem gleichen Code/Daten neu aufgebaut. Jetzt läuft es in 0,1 Sekunden.

Problem gelöst, nicht sicher, warum:/

0

Implementierung @Aprillion's idea #1 verursacht:

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

jetzt das wir tun können:

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

Versucht diese Lösung, leider keine Verbesserung. Nahm fast genau die gleiche Zeit wie mein vorheriger Versuch (~ 15 Sekunden). – jowparks