2016-05-10 12 views
0

Es gibt list1 und list2, die jeweils 1.104.824 Werte enthältSchneller Weg mysql Abfrage in Python zu tun

tabelle1 hat 350.000.000 Reihen mit 3 Spalten: ID, name1, name2

und das ist, was ich versucht zu tun :

con = mdb.connect('localhost','user','password','db') 
cur = con.cursor() 
for i in range(1104824) 
    sql ="select count(distinct(a.ID)) from (select name1 ,ID from table1 where name2 <> '"+str(list1[i])+"') as a where a.name1 = '"+str(list2[i])+"'" 
    cur.execute(sql) 
    data = cur.fetchone()[0] 

aber es ist sehr, sehr langsam. Gibt es eine schnellere Möglichkeit, diese Abfrage auszuführen?

+0

Post die Tabellenstruktur und was genau Sie versuchen zu tun. Sicherlich könnte es einen Weg geben, der nicht 1,1 Millionen Abfragen beinhaltet? – e4c5

+0

Wenn 'ID' die' PRIMARY KEY' ist, können Sie 'COUNT (DISTINCT ID)' wahrscheinlich in 'COUNT (*)' ändern. Wenn 'name1, name2' UNIQUE ist, können Sie wahrscheinlich' ID' loswerden. –

Antwort

1

Das ist Ihre Abfrage:

select count(distinct a.ID) 
from (select name1, ID 
     from table1 
     where name2 <> '"+str(list1[i])+"' 
    ) a 
where a.name1 = '"+str(list2[i])+"'"; 

Ich empfehle dieses Schreiben würde:

select count(distinct ID) 
from table1 
where name2 <> '"+str(list1[i])+"' and 
     name1 = '"+str(list2[i])+"'"; 

Dann können Sie die Abfrage mit einem Index auf table1(name1, name2, id) beschleunigen - alle drei Spalten in dieser Reihenfolge .

Hinweis: Ich würde schreibt die SQL als:

sql = """ 
select count(distinct ID) 
from table1 
where name2 <> '{0}' and name1 = '{1}' 
""".format(str(list1[i]), str(list2[i])) 
1

Scheint, wie dies würde auch mit dem entsprechenden Indizes arbeiten:

select count(distinct id) 
from table1 
where name2 <> 'Name1' 
    and name1 = 'Name2' 

Blick in parametrisierte Abfragen obwohl verwenden. Ihre Abfrage ist anfällig für sql Injektion und würde für Namen mit Apostrophen zum Beispiel brechen ... Viele Beispiele da draußen, hier ist ein paar: Python MySQL Parameterized Queries und https://stackoverflow.com/a/1633589/1073631

Verwandte Themen