zoukankan      html  css  js  c++  java
  • 项目中记录影响性能的缓慢数据库查询

    如果程序性能随着时间推移不断降低,那很有可能是因为数据库查询变慢了,随着数据库规模的增长,这一情况还会变得更糟。优化数据库有时很简单,需要在程序和数据库之间加入缓存。大多数数据库查询语言都提供了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 
    Parameters:%s 
    Duration:%fs
    Context:%s
     #####'% 
                (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 time
    
    from flask_sqlalchemy import SQLAlchemy, get_debug_queries
    
    db = 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 = email
    
        def 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 
    Parameters:%s 
    Duration:%fs
    Context:%s
     #####'% 
                (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 -

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

    注意:此方法 必须开启 debug 模式

                                                 
  • 相关阅读:
    JAVA RMI调用实战学习
    linux下关于压缩、解压相关的操作
    关于hessian接口类方法顺序及对象序列化的实战研究
    Java对象引用传递探索
    mysql 语句or效率问题
    树莓派做下载服务器 aria2 篇
    免费 cdn
    搞定迅雷固件在TP-LINK WR720N,127.0.0.1 9000 获取不到激活码
    Mware vCenter Server 识别固态硬盘为(非SSD)是什么原因?
    XXX esx.problem.syslog.nonpersistent.formatOnHost not found XXX
  • 原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_605days.html
Copyright © 2011-2022 走看看