数据库优化–示例
1.背景
通过监控软件可以明确的定位某个HTTP协议的API的响应时间在2-3秒(一般HTTP协议的API要控制在200ms以内),显然需要优化。
服务是一个djnago后台服务,采用原生ORM框架。
另外,该API内部业务逻辑并不复杂,主要是做了MySQL数据库I/O的全量查询。且查询中有很多级联查询。
2.说明
一个HTTP响应的优化可以从很多层面去做,这里单纯从业务代码和SQL语句的角度去优化。
3.分析
- 实际工作场景,监控到API响应慢一般是由运维等其他人员提出,作为开发人员需要用开发场景下的工具来进行复测和验证。
- django中数据库性能分析工具很多,常见如(下列同一个组织出品):
- 采用
silk
- 可以直接通过上述工具,清晰查看
request/response
和SQL
耗时情况,以及详细的函数调用堆栈和数据库查询语句。
4.调优思路
- 减少外部I/O
- 减少冗余调用
- 优化耗时逻辑
5.数据库优化的方式 – django ORM
0. 性能调优工具
1.django的shell (Debug=True), 查看django执行的原生SQL语句
>>> from django.db import connection
>>> connection.queries
2.explain()
查看某个语句执行情况
>>> Blog.objects.filter(title='My Blog').explain()
3.借助三方工具
- django-debug-toolbar
- silk
1.标准的数据库优化技术
1.1 添加必要的索引
1.数据库优化,首先可选索引;使用 Meta.indexes
或 Field.db_index
不同级别的设置
2.在频繁进行下列查询方式的操作上添加
filter
exclude
order_by
等
1.2 使用合适的字段类型
1.3 缓存技术
下面是针对django的ORM来谈
2.理解QuerySet
2.1 理解 QuerySet
赋值
1.惰性查询
- 创建、生成
QuerySet
对象时,不会发生数据库查询; - 只有需要 “输出”结果的时候才会发生数据库查询;