如果程序性能随着时间推移不断降低,那很有可能是因为数据库查询变慢了,随着数据库规模的增长,这一情况还会变得更糟。优化数据库有时很简单,需要在程序和数据库之间加入缓存。大多数数据库查询语言都提供了explain语句,用来显示数据库执行查询时采取的步骤。从这些步骤中,我们经常能发现数据库或索引设计的不足之处。过 ,在开始优化查询之前,我们必须要知道哪些查询是值得优化的。在一次典型请求中,可能要执行多条数据库查询,所以经常很难分辨哪一条查询较慢。Flask-SQLAlchemy提供了一个选项,可以记录请求中执行的与数据库查询相关的统计数字。                                                                     
                                                           ——Flask Web开发:基于Python的Web应用开发实战
具体操作步骤如下:
1.设置语句查询最低时间值  
app.config['FLASKY_DB_QUERY_TIMEOUT']=0.00000000001

2.在每次api请求结束后,判断每条查询语句执行时间是否低于设定的值,如果低于,则记录下查询语句相关信息。

@app.after_request
def after_request(response):#录影响性能的缓慢数据库查询for query in get_debug_queries():if query.duration >= app.config['FLASKY_DB_QUERY_TIMEOUT']:print '#####Slow query:%s \nParameters:%s \nDuration:%fs\nContext:%s\n #####'% \(query.statement, query.parameters, query.duration,query.context)return response

其中 (query.statement, query.parameters, query.duration,query.context) 属性含义如图:  

全部代码如下:

#coding:utf8
from flask import Flask, jsonify
import timefrom flask_sqlalchemy import SQLAlchemy, get_debug_queriesdb = SQLAlchemy()
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:password@127.0.0.1:3306/database_name?charset=utf8'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True
app.config['SECRET_KEY']='rgc is a good boy!hehe!'
# 启用缓慢查询记录功能
# app.config['SQLALCHEMY_RECORD_QUERIES']=True
app.config['FLASKY_DB_QUERY_TIMEOUT']=0.00000000001
db.init_app(app)class User(db.Model):__tablename__ = 'user'id = db.Column('id', db.Integer, primary_key=True, autoincrement=True)email = db.Column('email', db.String(64), unique=True)  # 邮箱def __init__(self, email):self.email = emaildef to_dict(self):output_dict = {}output_dict.update(self.__dict__)if "_sa_instance_state" in output_dict:del output_dict['_sa_instance_state']return output_dict@app.teardown_request
def handle_teardown_request(ex):db.session.remove()@app.after_request
def after_request(response):#录影响性能的缓慢数据库查询for query in get_debug_queries():if query.duration >= app.config['FLASKY_DB_QUERY_TIMEOUT']:print '#####Slow query:%s \nParameters:%s \nDuration:%fs\nContext:%s\n #####'% \(query.statement, query.parameters, query.duration,query.context)return response@app.route('/users/<email>')
def line_test(email):result_id=db.session.query(User.id).filter_by(email=email).first()return jsonify({'code':200,'email':email,'id':result_id[0]})if __name__=='__main__':app.run(debug=True)

运行结果如下:

 * Detected change in '/home/rgc/baidu_eye/carrier/test/flask_test_mongo.py', reloading* Restarting with reloader
#####Slow query:SELECT user.id AS user_id
FROM user
WHERE user.email = %s LIMIT %s
Parameters:('3@qq.com', 1)
Duration:0.000331s
Context:/home/rgc/baidu_eye/carrier/test/flask_test_mongo.py:47 (line_test)#####
127.0.0.1 - - [07/Mar/2018 18:37:05] "GET /users/3@qq.com HTTP/1.1" 200 -

通过此方式,把查询缓慢的数据记录到日志中,便可以进行针对性的数据库优化,提升用户体验。

                                             

转载于:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_605days.html

项目中记录影响性能的缓慢数据库查询相关推荐

  1. php怎么使用多个数据库,怎么在php项目中使用CI对多个数据库进行操作

    怎么在php项目中使用CI对多个数据库进行操作 发布时间:2020-12-19 16:57:21 来源:亿速云 阅读:87 作者:Leah 今天就跟大家聊聊有关怎么在php项目中使用CI对多个数据库进 ...

  2. android项目中记录ListView滚动停止位置与设置显示位置

    2019独角兽企业重金招聘Python工程师标准>>> 在项目中经常使用到listView控件,当想记录滚动停止时的记录,当点击加载新的数据,从记录的位置开始显示的操作怎么实现尼?分 ...

  3. java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

    Java项目中调用bat批处理配合使用BCP进行多用户数据的备份 一.项目需求 最近项目中需要对数据库(Sql Server系列数据库)进行备份.项目中的需求不是简单的整个数据库的备份,而是根据用户来 ...

  4. ufserver文件上传服务器-用来管理你项目中的图片-性能可比Java、Python高十倍不止

    大家在做项目的时候如果是web项目,项目又不大的情况下上传图片一般都是上传到项目的webapp目录下面,webapp下面会有一个upload的文件夹,今天给大家分享的是在项目中如何把图片上传到其他服务 ...

  5. Struts项目中,检测用户名是否被占用/查询账户名称是否被占用/查询账户名称是否已被注册/检查用户名是否被注册

    在客户端无法检测注册用户名是否被占用,这需要查询数据库,所以是服务器端负责这块. 实现思路大致描述: 注册表单中添加自动检测用户名是否被占用的功能,其实就是利用 ajax 向服务器发送请求,并带着用户 ...

  6. 在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  7. sqlserver数据库迁移mysql_在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合...

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  8. sqlserver 导入mysql,在项目中迁移MS SQLServer到Mysql数据库,实现MySQL数据库的快速整合...

    在开发项目的时候,往往碰到的不同的需求情况,兼容不同类型的数据库是我们项目以不变应万变的举措之一,在底层能够兼容多种数据库会使得我们开发不同类型的项目得心应手,如果配合快速的框架支持,那更是锦上添花的 ...

  9. 大型EAI项目中的ORACLE 数据库管理(ZT)

    数据库在大型EAI(企业应用集成)项目中扮演着至关重要的角色.目前许多企业都迫切需要将其自身传统的管理与运作模式转化为先进.高效的信息化管理与运作模式.在实施企业信息化的过程中,怎样将该企业原有大量数 ...

最新文章

  1. 杭电2099 整除的尾数
  2. php margin参数,margin参数简单介绍_html/css_WEB-ITnose
  3. LINQ To SQL 语法及实例大全
  4. C# 算法题系列(一) 两数之和、无重复字符的最长子串
  5. Waiting 180 more seconds for 1 worker threads to finish
  6. wait和notify使用例子
  7. syn重发_什么是“SYN”请求?ISN又是什么?
  8. VS2010链接SQLsever2008数据库时出现[DBNETLIB][ConnectionOpen (Connect()).]SQL Server 不存在或拒
  9. 印象笔记打开错误_只会用手机自带便签?这三款笔记软件分分钟秒杀
  10. linux中csh怎么运行,bash csh 设置环境变量 方法例子
  11. memcached可视化客户端工具
  12. Memcached在Windows7上的安装问题
  13. matlab在mac中好用吗,Matlab Mac版上手
  14. 远程小组软件开发过程(3):人
  15. uniapp-页面内/页面间数据的流动传递-this-that
  16. java 子网掩码 位数_java实现子网掩码转换为网络标识位 | 学步园
  17. 在线html调试,debugger调试
  18. java操作word文档(文字,图片,表格添加以及替换操作)
  19. 拯救者R7000ubuntu18.04解决分屏问题(NVIDIA显卡驱动安装)
  20. pdf 转 word 支持各种格式【在线办公工具】

热门文章

  1. axios学习笔记(二):轻松弄懂XHR的使用及如何封装简易axios
  2. 用css及jQuery实现的精美拉下菜单导航条
  3. 7-107 找出三位水仙花数 (15 分)
  4. 算法分析之对问题建模
  5. mysql bundle 安装_阿里云服务器下安装MySQL (Bundle压缩包 安装)
  6. idea 使用 maven 整合 ssm 框架 实现简单的增、删、改 和 分页查询功能
  7. 什么是进程?什么是线程?
  8. mysql十万条数据_2秒内向数据库中插入十万条数据?
  9. cpython python 区别面试_python基础教程之千万不要错过这几道Python面试题
  10. MySQL中通配类型各自作用_在Access数据库中。在查找操作中,通配符*、?与#各有什么作用?...