我的同事运行一个脚本,定期从数据库中提取数据。他正在使用查询:
SELECT url, data FROM table LIMIT {} OFFSET {}'.format( OFFSET, PAGE * OFFSET
我们使用亚马逊AURORAS,他有自己的奴隶服务器,但每次接触98%+
表有数百万条记录。
如果我们选择sqldump
而不是SQL查询来获取数据会不会很好?
我想到的选择是:
由于
答案 0 :(得分:0)
我在这里做了一些相当大的假设,但是来自
没有窒息
我猜你的意思是,当你的同事运行SELECT来获取大量数据时,所有其他操作(可能是你的主要应用程序)的数据库性能会下降,而数据正准备导出。 / p>
你提到了SQL转储,所以我也假设这位同事对大致正确的数据感到满意,即:它不必是即时交易正确的数据。对分析工作这样的东西来说已经足够好了。
如果这些假设很接近,您的同事和您的数据库可能会受益于
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
这行代码应该谨慎使用,几乎从不在业务应用程序中使用,但只要您完全理解其含义,它就可以帮助人们通过大查询查询实时数据库。
要使用它,只需启动一个事务并在运行任何查询之前放置此行。
' choking'
当您的同事运行大型查询时,您所看到的是记录锁定。您的数据库引擎 - 非常正确 - 设置为随时提供准确的数据视图。因此,当一个大型查询出现时,数据库引擎首先等待清除所有写锁(事务),运行大型查询并保留所有未来的写锁,直到查询运行。
这实际上发生在所有交易中,但你只是真正注意到它们。
无法解读的内容
通过将事务隔离级别设置为READ UNCOMMITTED,您告诉数据库引擎此事务不关心写锁定并继续读取。
这被称为“脏读”,因为长时间运行的查询可以很好地读取带有写锁定的表,并忽略锁定。实际读取的数据可能是写入事务完成之前的数据,或者是在此查询到达之前不同的事务可以启动和修改记录。
从具有READ UNCOMMITTED的任何内容返回的数据在数据库引擎的ACID意义上都不是保证是正确的,但对于某些用例,足够好。
效果是什么
您的大型查询可以更快地运行,并且在数据库运行时不会锁定它。
请谨慎使用,并在使用之前了解它的作用。