mysql子查询和python集
因此,我通过python包装器运行mysql脚本,但重要的部分在这里。我的目标是看哪个更快,进行两个单独的select DISTINCT()调用,并找到列表a中不在列表b中的那些调用。我还使用子查询来实现这一点 我发现子查询的速度要快得多(正如所希望的那样),但是它产生的结果是错误的mysql子查询和python集,python,mysql,set,subquery,Python,Mysql,Set,Subquery,因此,我通过python包装器运行mysql脚本,但重要的部分在这里。我的目标是看哪个更快,进行两个单独的select DISTINCT()调用,并找到列表a中不在列表b中的那些调用。我还使用子查询来实现这一点 我发现子查询的速度要快得多(正如所希望的那样),但是它产生的结果是错误的 starttime1 = time.time() LoLs.cursor.execute("SELECT DISTINCT(Id) FROM participants") drop = cursor.fetchal
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
427333
185.753734112
正如所料
然而:
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
结果:
545594
205.518273115
427333
185.753734112
它的速度快得多,很棒,但结果只有427333个条目,而不是545594个条目
作为说明,我对两个结束列表做了一个设置差异
打印透镜(列表(集合(drop1)-集合(drop2)))
结果:
118261
因此,第一个列表中有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 p
WHERE NOT EXISTS (SELECT 1
FROM history h
WHERE h.Id = p.summonerId)""")
仍然存在相同的问题,因为两个id都必须为非null。所以空值不存在