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

标签 python mysql

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

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/

相关文章:

python - 什么时候在 Python 中使用线程?

mysql - 尝试使用 dropzone 在 Laravel 5.1 中显示图像

php - MySQL 限制删除

python - 如何修复此 "TypeError: float() argument must be a string or a number, not ' 方法'"错误?

python - 如何在 pygtk 中获取 ms windows 桌面高度?

php - 按数值过滤mysql结果

.net - Vb.net通过普通的Oledb连接对象建立mySQL连接

mysql - 嵌套选择 mysql 操作数应包含 1 列

python - cx_Freeze 构建错误?

python - Django 错误 --SyntaxError : invalid syntax