黑马程序员技术交流社区
标题: 【上海校区】Django之ORM调优方法 [打印本页]
作者: 梁强 时间: 2020-1-9 12:09
标题: 【上海校区】Django之ORM调优方法
Web系统优化,可以采用自底向上的顺序,从数据库——>数据存储接口——>数据展示,按照这个顺序进行性能排查。
- 1、数据库(字段索引/数据模型)
- 2、存储接口(ORM/接口缓存)
- 3、数据展示(数据渲染/View报表)
本文主要介绍如何从ORM入手,进行SQL的优化,提高查询速度
ORM转Raw-SQL排查工具- 1、Mysql-Log日志
- 2、Django内置db模块 connection对象
- 3、django-exensions
- 4、django-debug-toolbar
Mysql-Log日志本文以Mac电脑为例,实时查看mysql数据库日志,观察ORM语句转SQL情况
1、进入mysql,修改设置
2、查询mysql日志文件位置
3、终端实时监控日志文件
[Bash shell] 纯文本查看 复制代码
# 注意使用sudo超级用户权限
sudo tail -f /usr/local/mysql/data/LQ.log
4、接下来,在Django中做的ORM操作,就可以在终端中实时查看转换后的原生SQL语句Django内置db模块 connection对象确保Django 配置文件 DEBUG设置为True
1、进入Django shell环境
[Bash shell] 纯文本查看 复制代码
>>> from django.db import connection
>>> connection.queries
[]
>>> from users.models import User
>>> User.objects.all()
<QuerySet [<User: 15517507781>, <User: python>]>
>>> connection.queries
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'}, {'sql': 'SELECT `tb_users`.`id`, `tb_users`.`password`, `tb_users`.`last_login`, `tb_users`.`is_superuser`, `tb_users`.`username`, `tb_users`.`first_name`, `tb_users`.`last_name`, `tb_users`.`email`, `tb_users`.`is_staff`, `tb_users`.`is_active`, `tb_users`.`date_joined`, `tb_users`.`mobile`, `tb_users`.`email_active`, `tb_users`.`default_address_id` FROM `tb_users` LIMIT 21', 'time': '0.001'}]
connection.queries只有在调试为真时。它是一个按查询执行顺序排列的字典列表。每个词典都有以下内容:
[Bash shell] 纯文本查看 复制代码
``sql`` -- The raw SQL statement
``time`` -- How long the statement took to execute, in seconds.
connection.queries查询包括所有SQL语句——插入、更新、选择等。每次应用程序访问数据库时,查询都会被记录下来。
2、使用多个数据库,您可以在connections字典的每个成员上使用相同的接口:
[Bash shell] 纯文本查看 复制代码
>>> from django.db import connections
>>> connections['my_db_alias'].queries
3、清除查询列表如果需要在函数的任意位置手动清除查询列表,只需调用reset_queries(),如下所示:
[Bash shell] 纯文本查看 复制代码
from django.db import reset_queries
reset_queries()
django-exensions显示原始SQLDjango Extensions是Django框架的自定义扩展的集合,后面我会专门写一篇文章来描述它
1、进入shell交互环境
[Bash shell] 纯文本查看 复制代码
# pip install django-extensions
$ python manage.py shell_plus --print-sql
2、在命令行输入查询语句,会自动打印SQL内容。
[Bash shell] 纯文本查看 复制代码
>>> User.objects.all()
SELECT `tb_users`.`id`, `tb_users`.`password`, `tb_users`.`last_login`, `tb_users`.`is_superuser`, `tb_users`.`username`, `tb_users`.`first_name`, `tb_users`.`last_name`, `tb_users`.`email`, `tb_users`.`is_staff`, `tb_users`.`is_active`, `tb_users`.`date_joined`, `tb_users`.`mobile`, `tb_users`.`email_active`, `tb_users`.`default_address_id` FROM `tb_users` LIMIT 21
Execution time: 0.001154s [Database: default]
<QuerySet [<User: python32>, <User: python>]>
调试配置面板django-debug-toolbardjango-debug-toolbar可以在web端查看SQL查询的详细统计结果
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |