python通过flask-SQLAlchemy触发器优化性能 妖狐艹你老母 2022-03-29 16:16 480阅读 0赞 最近在学习python web开发,flask web框架让python web开发变得非常简单。在学习《Flask Web开发实战》中的开源博客(blueblog)程序时发现有很多地方的写法值得商榷,都可以进行优化。 如在显示文章数和回复数的时候是在模板中直接通过对象列表的长度来获取如\{ \{ category.posts|length \}\},这种方式实际是进行查询后再获取对象列表的长度,而这种查询是没有其他分页条件,会将所有的记录查出来。如果作为学习用作展示jinja2的length过滤器的功能还好说,用在实际的项目中将会引起很大的性能问题。如果某个类目下的文章很多以后,这种方式将会引起程序的崩溃。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70][] 获取分类下的文章数代码, \{% for category in categories %\} <li class="list-group-item list-group-item-action d-flex justify-content-between align-items-center"> <a href="\{ \{ url\_for('blog.show\_category', category\_id=category.id) \}\}"> \{ \{ category.name \}\} </a> <span class="badge badge-primary badge-pill"> \{ \{ category.posts|length \}\}</span> </li> \{% endfor %\} 打开flask 的调试监控器可以清楚的看到循环类目列表并且每个类目都去查询了类目下文章的信息,如果在每个类目下的文章数据量小的时候还可以接受,数据量大了必将会引起程序崩溃。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 1][] 能不能不用每次都去查询类目下的文章数呢?想到的办法是在类目表新增一个字段来记录该类目的文章数。但是如何保证文章数的准确性呢?那就用到了flask-SQLAlchemy触发器在新增文章或删除文章的时候同时更新类目中的文章数。具体如下: 1、在类目表新增字段来记录该类目的文章数 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 2][] 2、在文章类中增加触发需要调用的更新文章数目的类方法。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 3][] @staticmethod def chang\_post\_count(category\_id): db.session.execute(text('update category set post\_count=(select count(1) from post where category\_id=:category\_id) where id=:category\_id'), \{'category\_id': category\_id\}) @staticmethod def on\_insert(mapper, connection, target): Post.chang\_post\_count(target.category\_id) @staticmethod def on\_delete(mapper, connection, target): Post.chang\_post\_count(target.category\_id) 3、注册触发器的事件监听 db.event.listen(Post,'**after\_insert**',Post.on\_insert) db.event.listen(Post,'after\_delete',Post.on\_delete) 这里就是说在Post的增加或删除时都会触发Post类的on\_insert或on\_delete方法去更新文章的数目。 4、最后将类目下的文章数改成直接通过实例的属性进行展示 \{ \{ category.post\_count \}\} 这样就通过flask-SQLAlchemy触发器实现了动态更新数据,避免反复查询的低效方式。虽然在新增或删除文章时会多了一步触发操作,但一般来说博客系统的更新操作的频率远远低于查询的频率,所以对于新增或删除来说不会有太大的影响。 最后效果: ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 4][] 可以看到循环的查询没有了,整个页面的执行时间从97毫秒变成了14毫秒,说明优化的效果还是蛮显著的。更重要的是避免了文章数据量多了后系统崩溃的隐患。 全部代码见github [https://github.com/xiejava1018/ishareblog][https_github.com_xiejava1018_ishareblog] 开源博客效果 [http://blog.ishareread.com][http_blog.ishareread.com] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70]: /images/20220329/a4875232e6234f45909c372b8d8bdf76.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 1]: /images/20220329/1ad8ec5d997e475a9744c6c6beb294c4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 2]: /images/20220329/ef58f836005d49a38d6fb6e6933c3fb4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 3]: /images/20220329/dc60bd9e8ec042c4b4afbabd7b24f59a.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1bGxidWc_size_16_color_FFFFFF_t_70 4]: /images/20220329/f918dda5f490453380cc4f53f24db648.png [https_github.com_xiejava1018_ishareblog]: https://github.com/xiejava1018/ishareblog [http_blog.ishareread.com]: http://blog.ishareread.com/
相关 性能瓶颈案例:如何通过Java分析并优化代码性能? 在Java编程中,性能瓶颈可能会出现在许多地方,如循环、递归、数据库查询、网络通信等。 以下是如何通过Java进行性能分析和优化的步骤: 1. **性能测试**: - 痛定思痛。/ 2024年09月25日 18:00/ 0 赞/ 71 阅读
相关 性能优化挑战:Java应用程序如何通过代码优化提高性能? Java应用程序的性能优化是一个复杂的过程,需要从多个层面进行代码优化。以下是一些主要的优化策略: 1. 数据结构选择:合理使用数据结构如集合、数组和链表等,可以减少不必要的 梦里梦外;/ 2024年09月18日 18:39/ 0 赞/ 77 阅读
相关 性能瓶颈:如何通过Java优化数据库访问? 在Java中优化数据库访问通常涉及到以下几个方面: 1. **连接池**:创建一个连接池可以避免频繁地建立和关闭数据库连接,显著提高系统性能。 2. **预编译语句**:使 深碍√TFBOYSˉ_/ 2024年09月11日 09:36/ 0 赞/ 47 阅读
相关 爱上python系列------python性能(五):字符串拼接性能优化 python里面字符串是不可变的,在拼接的时候 速度会比较慢,因为拼接任意不可变序列都会生成一个新的序列对象 也就是说在拼接的过程中会产生很多中间对象,新建对象肯定需要时间, ╰半橙微兮°/ 2022年12月17日 11:57/ 0 赞/ 218 阅读
相关 通过GZIP优化性能 原创文章,转载请注明 gzip为一种压缩技术,在网络http传输中得到应用。gzip需要web容器,浏览器的支持。 墨蓝/ 2022年07月16日 15:18/ 0 赞/ 173 阅读
相关 通过批量操作优化性能 1、更新优化(插入、修改、删除) 数据量大的时间,批量插入大量数据可能会导致数据库崩溃,所以可分批批量插入,如现在要批量插入用户数据,可以一次插入200条; Lis àì夳堔傛蜴生んèń/ 2022年04月13日 12:59/ 0 赞/ 224 阅读
相关 python通过flask-SQLAlchemy触发器优化性能 最近在学习python web开发,flask web框架让python web开发变得非常简单。在学习《Flask Web开发实战》中的开源博客(blueblog)程序时发现 妖狐艹你老母/ 2022年03月29日 16:16/ 0 赞/ 481 阅读
相关 Python性能优化 讲稿分享 “Python性能优化”讲稿分享 烟花三月,对我来说,是一个多事的季节。谋划了人生中的第一次跳槽,手忙脚乱地,终于匆忙离职。在之前,曾经 你的名字/ 2022年02月14日 08:39/ 0 赞/ 222 阅读
相关 通过编码规范优化JavaScript性能 @\[TOC\]通过编码规范优化JavaScript性能 通过编码规范优化JavaScript性能 避免全局查找 如果在一个函数中多次访问一个全局变量,应将其保存 蔚落/ 2021年07月26日 19:09/ 0 赞/ 400 阅读
还没有评论,来说两句吧...