MySQL:如何从MySQL中获取大量数据而不会窒息?

时间:2017-09-18 07:15:06

标签: python mysql

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

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

我们使用亚马逊AURORAS,他有自己的奴隶服务器,但每次接触98%+

表有数百万条记录。

如果我们选择sqldump而不是SQL查询来获取数据会不会很好?

我想到的选择是:

  • 选择表的SQL DUMP(不确定基准)
  • 根据特定参考(日期,ID等)联合表格

由于

1 个答案:

答案 0 :(得分:0)

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

  

没有窒息

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

你提到了SQL转储,所以我也假设这位同事对大致正确的数据感到满意,即:它不必是即时交易正确的数据。对分析工作这样的东西来说已经足够好了。

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

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

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

' choking'

当您的同事运行大型查询时,您所看到的是记录锁定。您的数据库引擎 - 非常正确 - 设置为随时提供准确的数据视图。因此,当一个大型查询出现时,数据库引擎首先等待清除所有写锁(事务),运行大型查询并保留所有未来的写锁,直到查询运行。

这实际上发生在所有交易中,但你只是真正注意到它们。

无法解读的内容

通过将事务隔离级别设置为READ UNCOMMITTED,您告诉数据库引擎此事务不关心写锁定并继续读取。

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

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

效果是什么

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

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

MySQL Manual on transaction isolation levels