gpt4 book ai didi

python - MySQL:如何从MySQL中提取大量数据而不阻塞它?

转载 作者:行者123 更新时间:2023-11-29 18:24:56 25 4
gpt4 key购买 nike

我的同事运行一个脚本,定期从数据库中提取数据。他正在使用查询:

SELECT url, data FROM table LIMIT {} OFFSET {}'.format( OFFSET, PAGE * OFFSET

我们使用 Amazon AURORAS,他有自己的从属服务器,但每次都达到 98%+

表有数百万条记录。

如果我们使用 sqldump 而不是 SQL 查询来获取数据,会不会更好?

我想到的选项是:

  • 选择性表的 SQL DUMP(不确定基准)
  • 根据特定引用(日期、ID 等)联合表格

谢谢

最佳答案

我在这里做了一些相当大的假设,但是来自

without choking it

我猜您的意思是,当您的同事运行 SELECT 来获取大量数据时,在准备导出数据时,所有其他操作(可能是您的主要应用程序)的数据库性能都会下降。

您提到了 SQL 转储,因此我还假设这位同事会对大致正确的数据感到满意,即:它不必达到即时事务正确的数据。对于分析工作之类的工作来说已经足够了。

如果这些假设很接近,您的同事和您的数据库可能会受益

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

这行代码应该谨慎使用,几乎不要在业务应用程序中使用,但它可以帮助人们通过大查询查询实时数据库,只要您完全理解其含义。

要使用它,只需启动一个事务并将此行放在您运行的任何查询之前即可。

“窒息”

当您的同事运行大型查询时,您会看到记录锁定。您的数据库引擎的设置非常正确,可以随时提供准确的数据 View 。因此,当大型查询出现时,数据库引擎首先等待所有写锁(事务)清除,运行大型查询并保留所有 future 的写锁,直到查询运行。

这实际上发生在所有交易中,但您只有在大交易中才会真正注意到它。

READ UNCOMMITTED 的作用

通过将事务隔离级别设置为 READ UNCOMMITTED,您可以告诉数据库引擎该事务不关心写锁,并且无论如何都可以继续读取。

这称为“脏读”,因为长时间运行的查询可以很好地读取带有写锁的表,并且会忽略该锁。实际读取的数据可能是写入事务完成之前的数据,或者不同的事务可以在此查询到达之前启动并修改记录。

从 READ UNCOMMITTED 的任何内容返回的数据都不能保证在数据库引擎的 ACID 意义上是正确的,但对于某些用例来说它足够好

效果如何

您的大型查询神奇地运行得更快,并且在运行时不会锁定数据库。

请谨慎使用,并在使用之前了解它的作用。

MySQL Manual on transaction isolation levels

关于python - MySQL:如何从MySQL中提取大量数据而不阻塞它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46273605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com