SQLAlchemy - 数据库命中每个请求?

时间:2009-05-19 08:11:21

标签: python sqlalchemy

我目前正在使用Python编写的Web应用程序(并使用SQLAlchemy)。为了处理身份验证,应用程序首先在会话中检查用户ID,并提供该用户ID,将整个用户记录从数据库中提取出来并将其存储在该请求的其余部分中。还运行另一个查询来检查它已存储的用户的权限。

我对Web应用程序开发领域还不熟悉,但根据我的理解,在每个请求上访问数据库时效率都不高。或者这被认为是正常的事情?

到目前为止,我唯一想到的是将这些数据提取一次,然后存储相关内容(每个请求都不需要大部分数据)。但是,这会带来如果在此期间恰好删除此用户记录会发生什么的问题。关于如何最好地管理这个的任何想法?

4 个答案:

答案 0 :(得分:3)

“在每个请求上点击数据库这样的东西效率不高。”

假。并且,您已经假设没有缓存,这也是错误的。

大多数ORM图层完全能够缓存行,从而节省了一些数据库查询。

大多数RDBMS都有广泛的缓存,因此对常见查询的响应速度非常快。

所有ORM层都将使用一致的SQL,进一步帮助数据库优化重复操作。 (具体来说,SQL语句是缓存的,可以节省解析和计划时间。)

“或者这被认为是正常的事情吗?”

真。

在您证明您的查询是应用程序中最慢的部分之前,请不要担心。构建实际工作的东西。然后优化你可以证明是瓶颈的部分。

答案 1 :(得分:3)

对于简单 Web应用程序中的用户登录和基本权限令牌,我肯定会将其存储在基于cookie的会话中。确实,每个请求的一些SELECT根本不是什么大问题,但是如果你可以从缓存数据执行部分/全部web请求而没有DB命中,那么这只会增加更多的可伸缩性一个计划接收大量负载的应用程序。

在数据库上更改用户令牌的问题以两种方式处理。一个是,忽略它 - 对于很多用例而言,用户注销并再次重新登录以获得已在其他地方授予的新权限(见证unix作为示例)并不是什么大不了的事。另一个是用户行的所有突变都通过一种方法进行过滤,该方法也会重置基于cookie的会话中的状态,但这只有在用户自己是通过浏览器界面启动更改的用户时才有效。 / p>

如果上述用例中没有OTOH适用于您,那么您可能需要在每个请求中内置一些数据库访问权限。

答案 2 :(得分:2)

您基本上是在谈论将数据缓存为性能优化。与往常一样,过早优化是一个坏主意。事先很难知道瓶颈在哪里,如果应用领域对你来说是新的,那就更难了。优化增加了复杂性,如果你优化了错误的东西,你不仅浪费了精力,而且还使得必要的优化变得更加困难。

通常,请求用户数据通常是一个非常简单的查询。您可以自己构建一个简单的基准测试,以了解它将引入哪种开销。如果它不是你的时间预算的很大一部分,那就留下吧。

如果您仍想在应用程序服务器上缓存数据,则必须提出缓存失效方案。

可能的方案是检查数据库中的更改。如果您没有大量数据要缓存,那么这实际上并不比仅重新加载它更有效。

另一个选择是暂停缓存数据。如果变化的即时可见性不重要,这是一个很好的选择。

另一种选择是在更改时主动使缓存无效。这取决于您是仅通过应用程序修改数据库,还是只有一个应用程序服务器或集群解决方案。

答案 3 :(得分:1)

这是一个数据库,因此通常“命中”数据库以提取所需数据是相当常见的。如果构建联接或存储过程,则可以减少单个查询。