七月老师,我现在是第二遍学这课,现在在准备面试,听一个讲面试的课,说要准备项目的技术亮点。我觉得这个优化数据库查询是个不错的可以提炼的点,下面是这写的,你觉得怎么样,可以提点优化的建议吗,先谢谢老师了!
你能具体讲讲怎么优化mysql查询的吗?
先通过uid查询,拿到这个uid的所有gifts,这是一次查询,前端查询每本书的时候,它都要通过这本书的isbn来查询有多少人想送这本书给你,这个技术的好处在于,代码写起来简单。但它的问题在于,用户想送多少本书,不是你能控制的。如果它想送一万本,那么就要去数据库查询一万次,去数据库查询一万次是很费时间的。所以,为了解决这个问题,我想到可以换一种思路。减少去数据库查询的次数,这个技术方案的不好的地方是代码就没那么简捷。不过我还是选择重构下,我不能容忍这种不可控的因素。具体思路就是:
拿到当前用户的所有gift对象列表
得到一个列表,这个列表是用户的gift对象的isbn列表
得到一个列表,这个列表里面是字典,字典有两个键值对,一个count,一个isbn
这相当于什么呢?之前是每本书都去查询一次数据库,现在的思路是,我先去数据库里拿到所有gift,然后通过一个列表生成式拿到一个isbn的列表,再通过这个isbn列表去数据库里拿到一个列表,这个列表时每一个元素是字典,一个count对应一个isbn,就是一次性地拿到所有书籍的wish_count,这个可以通过db.session.query来实现。
count_list = db.session.query(func.count(Wish.id), Wish.isbn).filter(
Wish.launched == False,
Wish.isbn.in_(isbn_list),
Wish.status == 1).group_by(
Wish.isbn).all()
最后再构造一个转换类,用拿到的这个列表,和我的礼物列表,组装成前端需要的数据。
我打个类比,这相当于什么呢?这就相当于点餐,本来公司每个人都要跑去馆点一份菜,现在你提出来,先把要点餐的人记录下来,列成列表,再派一个人一次性的把公司100份的饭买回来
7月老师深入浅出剖析Flask核心机制,和你一起探讨Python高级编程
了解课程