MySQL Python查询大数据库太长时间

2024-10-01 02:22:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据库,其中有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}$

我没有足够的智慧想出一个方法来加快这个速度,所以如果有任何人有任何建议,将不胜感激,谢谢!在


Tags: 函数字符串名称id数据库应用程序列表foo
1条回答
网友
1楼 · 发布于 2024-10-01 02:22:10

如果您只是测试在def = 'str'的每个表中是否存在一行,那么一个简单的操作(没有其他更改)是在查询的末尾添加一个LIMIT 1子句。在

(如果您的查询正在执行全表扫描,MySQL可以在找到第一行后停止它。如果找不到行,则完整表扫描必须运行到表的末尾。)

这还避免了准备许多行返回给客户机,并在不需要的情况下将它们返回给客户机的开销。在

另外,如果您的查询是在大表中查找“大海捞针”,那么以def作为前导列的索引(至少在最大的表上)可能有助于提高性能。在


更新:

我重读了你的问题,我看到你有30000个表要检查,这是30000个单独的查询,30000次到数据库的往返。(ACCCKKK.)

所以我之前的建议是没有用的。(对于每个有30000行的40个表来说,这更合适。)

另一种方法是同时查询一堆这样的表。我甚至会犹豫是否一次尝试超过几百张桌子,所以我会分批去做。在

SELECT DISTINCT 'Table1' AS table_name FROM Table1 WHERE def = 'str'
 UNION ALL
SELECT DISTINCT 'Table2' FROM Table2 WHERE def = 'str'
 UNION ALL
SELECT DISTINCT 'Table3' FROM Table3 WHERE def = 'str'

如果def在每个表中都是唯一的,或者,如果它几乎是唯一的,并且您可以处理返回的重复表名值,则可以去掉DISTINCT关键字。在

您需要确保列表中的每个表都有一个名为def的列。如果遇到没有该列的表,则整个批处理将失败。而SHOW TABLES不执行列名的检查。我将使用类似这样的查询来获取具有名为def的列的表名列表:

^{pr2}$

相关问题 更多 >