我有一个数据库,其中有30000多个表,每个表中大约有40-100行。我想检索一个表名列表,其中在特定列下包含一个字符串。在
例如:
我想检索包含'foo'的所有表的名称。。。在
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分钟以上的时间来执行,这对我心目中的应用程序来说太长了。在
^{pr2}$我没有足够的智慧想出一个方法来加快这个速度,所以如果有任何人有任何建议,将不胜感激,谢谢!在
如果您只是测试在
def = 'str'
的每个表中是否存在一行,那么一个简单的操作(没有其他更改)是在查询的末尾添加一个LIMIT 1
子句。在(如果您的查询正在执行全表扫描,MySQL可以在找到第一行后停止它。如果找不到行,则完整表扫描必须运行到表的末尾。)
这还避免了准备许多行返回给客户机,并在不需要的情况下将它们返回给客户机的开销。在
另外,如果您的查询是在大表中查找“大海捞针”,那么以
def
作为前导列的索引(至少在最大的表上)可能有助于提高性能。在更新:
我重读了你的问题,我看到你有30000个表要检查,这是30000个单独的查询,30000次到数据库的往返。(ACCCKKK.)
所以我之前的建议是没有用的。(对于每个有30000行的40个表来说,这更合适。)
另一种方法是同时查询一堆这样的表。我甚至会犹豫是否一次尝试超过几百张桌子,所以我会分批去做。在
如果
def
在每个表中都是唯一的,或者,如果它几乎是唯一的,并且您可以处理返回的重复表名值,则可以去掉DISTINCT关键字。在您需要确保列表中的每个表都有一个名为
^{pr2}$def
的列。如果遇到没有该列的表,则整个批处理将失败。而SHOW TABLES
不执行列名的检查。我将使用类似这样的查询来获取具有名为def
的列的表名列表:相关问题 更多 >
编程相关推荐