所以我通过一个python包装器运行mysql脚本,但是重要的部分在这里。我的目标是查看哪个更快,分别执行两个select DISTINCT()调用,并找到列表a中不在列表b中的调用。我还使用子查询完成了这项工作。
我发现子查询的速度要快得多(如所希望的那样),但是它产生的结果是错误的。
starttime1 = time.time()
LoLs.cursor.execute("SELECT DISTINCT(Id) FROM participants")
drop = cursor.fetchall()
drop = [x[0] for x in drop]
LoLs.cursor.execute("SELECT DISTINCT(Id) FROM history")
exist = cursor.fetchall()
exist = [x[0] for x in exist]
drop1 = list(set(drop)-set(exist))
endtime1 = time.time()
print len(drop1)
print endtime1 - starttime1
这将导致:
545594
205.518273115
如预期。
然而:
starttime2 = time.time()
cursor.execute("SELECT DISTINCT(Id) FROM participants where Id NOT IN (SELECT DISTINCT(Id) FROM history)")
drop2 = cursor.fetchall()
drop2 = [x[0] for x in drop2]
drop2 = list(set(drop2))
endtime2 = time.time()
print len(drop2)
print endtime2 - starttime2
结果:
427333
185.753734112
速度快得多,很棒,但结果只有427333个条目,而不是545594个。
作为一个注释,我对两个结束列表做了一个设置差异
打印长度(列表(集合(drop1)-集合(drop2)))
结果:
十一万八千二百六十一
所以第一个列表中有118261个不在第二个列表中的条目。我甚至取了其中的一些,并手动检查它们是否在历史表中,它们是,所以子查询应该已经捕捉到它们了。
注3月6日:更改:
cursor.execute("SELECT DISTINCT(Id) FROM participants where summonerId NOT IN (SELECT DISTINCT(Id) FROM history)")
到
cursor.execute("SELECT DISTINCT(Id) FROM participants where Id NOT IN (SELECT DISTINCT(Id) FROM history)")
以准确反映真实问题。
最佳答案
NOT IN queries remove nulls。请改为:
cursor.execute("""SELECT DISTINCT(Id)
FROM participants p
WHERE NOT EXISTS (SELECT 1
FROM history h
WHERE h.Id = p.summonerId)""")
关于python - mysql子查询和python集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35808388/