【发布时间】:2019-01-16 16:03:31
【问题描述】:
一般:
我需要从具有数十万个条目的给定数据库创建一个统计工具。所以我永远不需要写入数据库,只需要获取数据。
问题:
我有一个用户表,在我的情况下,我选择 20k 用户(在两个日期之间)。现在我只需要选择至少花钱过一次的用户(来自这些20k)。
为此,我有 3 个不同的表来保存数据,无论用户是否花钱。 (所以我们在这里总共使用 4 个表):
User, Transaction_1, Transaction_2, Transaction_3
到目前为止我做了什么:
在 User 类的模型中,我创建了一个属性,用于检查用户是否在其中一个事务表中出现过一次:
@property
def spent_money_once(self):
spent_money_atleast_once = False
in_transactions = Transaction_1.query.filter(Transaction_1.user_id == self.id).first()
if in_transactions:
spent_money_atleast_once = True
return spent_money_atleast_once
in_transactionsVK = Transaction_2.query.filter(Transaction_2.user_id == self.id).first()
if in_transactionsVK:
spent_money_atleast_once = True
return spent_money_atleast_once
in_transactionsStripe = Transaction_3.query.filter(Transaction_3.user_id == self.id).first()
if in_transactionsStripe:
spent_money_atleast_once = True
return spent_money_atleast_once
return spent_money_atleast_once
然后我为男性和女性用户创建了两个计数器,因此我可以计算这 2 万用户中有多少人至少花钱过一次:
males_payed_atleast_once = 0
females_payed_atleast_once = 0
for male_user in male_users.all():
if male_user.spent_money_once is True:
males_payed_atleast_once += 1
for female_user in female_users.all():
if female_user.spent_money_once is True:
females_payed_atleast_once += 1
但这需要很长时间来计算,大约 40-60 分钟。我从来没有处理过这么大的数据量,也许这很正常?
其他信息:
如果您想知道 male_users 和 female_users 的样子:
# Note: is this even efficient, if all() completes the query than I need to store the .all() into variables, otherwise everytime I call .all() it takes time
global all_users
global male_users
global female_users
all_users = Users.query.filter(Users.date_added >= start_date, Users.date_added <= end_date)
male_users = Users.query.filter(Users.date_added >= start_date, Users.date_added <= end_date, Users.gender == "1")
female_users = Users.query.filter(Users.date_added >= start_date, Users.date_added <= end_date, Users.gender == "2")
我正在尝试将某些查询保存在全局变量中以提高性能。
我正在使用 Python 3 |烧瓶 |用于此任务的 Sqlalchemy。数据库是 MySQL。
【问题讨论】:
-
3张事务表的意义是什么?您需要计算 each 表中的重复次数吗?还是仅结合所有 3 个?
标签: python mysql sql performance sqlalchemy