所以我通过一个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/

10-13 23:08