有list1和list2,每个包含1,104,824个值
table1有350,000,000行,包含3列:ID,name1,name2
这就是我试图做的事情:
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]
但它非常慢。有没有更快的方法来进行此查询?
答案 0 :(得分:1)
这是您的查询:
select count(distinct a.ID)
from (select name1, ID
from table1
where name2 <> '"+str(list1[i])+"'
) a
where a.name1 = '"+str(list2[i])+"'";
我建议将其写成:
select count(distinct ID)
from table1
where name2 <> '"+str(list1[i])+"' and
name1 = '"+str(list2[i])+"'";
然后,您可以使用table1(name1, name2, id)
上的索引加快查询速度 - 按此顺序排列所有三列。
注意:我会将sql编写为:
sql = """
select count(distinct ID)
from table1
where name2 <> '{0}' and name1 = '{1}'
""".format(str(list1[i]), str(list2[i]))
答案 1 :(得分:1)
似乎这样可以与适当的指数一起使用:
select count(distinct id)
from table1
where name2 <> 'Name1'
and name1 = 'Name2'
考虑使用参数化查询。您的查询容易受到sql注入的影响,并且会因为撇号而破坏名称...例如,有很多例子,这里有几个:Python MySQL Parameterized Queries和https://stackoverflow.com/a/1633589/1073631