我有一个数据库,每个表中有超过30,000个表和〜40-100行。我想检索包含特定列下的字符串的表名称列表。MySQL Python花费太长时间来查询大型数据库
因此,例如:
我想要检索包含“富”的所有表的名字...
Database
Table_1
ID: 1, STR: bar
ID: 2, STR: foo
ID: 3, STR: bar
Table_2
ID: 1, STR: bar
ID: 2, STR: bar
ID: 3, STR: bar
Table_3
ID: 1, STR: bar
ID: 2, STR: bar
ID: 3, STR: foo
在这种情况下,函数返回[“TABLE_1”
所以,' Table_3']
到目前为止,我有这个,它工作正常,但需要2分钟的时间来执行,这对于我想要的应用程序来说太长了。
self.m('SHOW TABLES')
result = self.db.store_result()
tablelist = result.fetch_row(0, 1)
for table in tablelist:
table_name = table['Tables_in_definitions']
self.m("""SELECT `def` FROM `""" + table_name + """` WHERE `def` = '""" + str + """'""")
result = self.db.store_result()
r = result.fetch_row(1, 1)
if len(r) > 0:
results.append(table_name)
我不够聪明想出一种方法来加快这一点,所以如果任何人有任何建议,将不胜感激,谢谢!
感谢您的评论,“高清”是唯一的,这样像你说的,我只是检查每个表中有1行。我会看看LIMIT 1中的表现是否有所提高,并使其成为领先专栏。 – amba88 2012-07-18 20:02:33
我已经更新了我的答案......我更仔细地阅读了您的问题,并且我不认为我的第一个建议(使用LIMIT 1)会帮助很多......您没有花时间扫描表格,您可能会花费大部分时间为数据库创建30000次以上的往返运行,以运行快速运行的查询。更好的方法是使用UNION ALL方法同时查询多个表,并让查询返回table_name中的行。 – spencer7593 2012-07-18 20:29:04
好吧,非常感谢您的建议,我会尝试使用UNION所有的方法,看看会发生什么。表名都是唯一的,每个表都有一个def列,所以我认为SHOW TABLES应该足够了。 – amba88 2012-07-18 21:05:08