1
loading 2016-06-22 21:24:44 +08:00 via Android
Orm 带来的特性,付出一点点内存,值得!
|
2
loading 2016-06-22 21:25:37 +08:00 via Android
而且,复杂的 SQL,很多人写出来比 orm 的性能要差。
|
3
rogwan OP @loading 嗯,一般情况下这个必须是值得的。就是遇到 Article 这种对象,有文章的内容( text 类型),可能一篇文章记录就几十 K 啊。比如查询出来用户关注的文章, 1 个用户关注 1000 个人,想象下 1 万个用户,那内存得要多大啊?
|
4
loading 2016-06-22 21:37:38 +08:00 via Android
就你这样玩,直接写 SQL 更不行…
|
5
msg7086 2016-06-22 21:47:51 +08:00
好点的 ORM 可以分段读取吧。 Python 不熟,但是至少数据分页查询不是个很难的事情。
|
7
NearTan 2016-06-22 22:26:59 +08:00
|
8
rogwan OP |
9
NearTan 2016-06-22 23:11:33 +08:00
@rogwan yield_per 用到的是迭代器,跟分页没关系
仔细看了一下你的需求,你的「多重运算」感觉可以通过 SQLAlchemy 层来解决 |
10
rogwan OP @NearTan "SQLAlchemy 层",你是指用 ORM 的 xxx.query.filter(www.query.filter(www.query.filter()))这样的嵌套查询吗?
|
11
rogwan OP yield_per 倒是一个看起来可以平衡内存占用和 SQL 查询效率的一个方式,以前没有用过,可以尝试下实际的运行效率好不好。
|
12
daybyday 2016-06-23 10:19:48 +08:00
"根据 author/ip/post_time 等等做多重运算"
如果这些字段可以抽象出一条计算公式,那么可以在更新 article 记录的时候,用这些字段计算出最终值。使用 redis zset 来存储 /缓存,最终值为 zset 的 score , article_id 为 zset 的 member 。需要获取分页的时候,先从 redis zset 取分页 id 集,再从数据库取数据 |
14
sfree2005 2016-06-23 11:41:51 +08:00
@daybyday 的方法是一个方向,在他方法的基础上你还可以参考这篇文章,看看如果要 filter 各种数据的话, redis 应该做怎样的设计。
文章链接: https://robots.thoughtbot.com/redis-set-intersection-using-sets-to-filter-data 有一点难度,但用好了 filter 的速度很快。 还有一种可能比较粗暴, 没有那么好, 但还算简单的方法。 我假设你 Article 内容本身不在你的要计算和分析的范围,那就可以将 Article id 和各种需要计算和 filter 的 column 单独放个 table , 每次只是查询那个 table ,过滤、分析得到 id 集之后分页, 接着再去查那个真正的 Article table , 这样内存的占用应该少很多了。 |