python mysql 查询时间_MySQL Python花太长时间查询大型数据库

我有一个数据库,其中包含30,000多个表,每个表中约有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分钟以上的时间来执行,对于我所想到的应用程序来说,这太长了.

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)

我不够聪明,无法提出一种加快速度的方法,因此,如果有人有任何建议,将不胜感激,谢谢!

解决方法:

如果仅在def =’str’的每个表中测试是否存在一行,则要做的一件简单的事情(没有其他更改)是在查询的末尾添加一个LIMIT 1子句.

(如果查询正在执行全表扫描,则在找到第一行后,MySQL可以将其暂停.如果未找到行,则全表扫描必须运行到表的末尾.)

这也避免了准备大量要返回给客户端的行,以及在不需要它们时将它们返回给客户端的开销.

另外,如果查询正在大型表中查找“大海捞针”,则以def为首列的索引(至少在最大的表上)可能会提高性能.

更新:

我重新阅读了您的问题,发现您有30,000个表要检查,即30,000个独立的查询,数据库的30,000次往返. (ACCCKKK.)

所以我以前的建议几乎没有用. (用40个表每行30,000行会更合适.)

另一种方法是同时查询一堆这些表.但是,我一次甚至不愿意尝试几百张桌子,所以我会分批进行.

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在每个表中都是唯一的,或者如果它几乎是唯一的,并且您可以处理返回的重复table_name值,则可以摆脱DISTINCT关键字.

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

SELECT table_name

FROM information_schema.columns

WHERE table_schema = DATABASE()

AND column_name = 'def'

GROUP BY table_name

ORDER BY table_name

标签:performance,python,mysql

来源: https://codeday.me/bug/20191201/2077819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值