数据库优化查询

only与defer

orm内所有的语句操作都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的,这样设计的好处在于减轻数据库的压力

res = models.Book.objects.all()
print(res)

res = models.Book.objects.values(‘title‘)
print(res)
for r in res:
    print(r.title)

res = models.Book.objects.only(‘title‘)
print(res)
for r in res:
     print(r.title)  # 只走一次数据库查询
     print(r.price)  # 当你点击一个不是only括号内指定的字段的时候 不会报错 而是会频繁的走数据库查询

res1 = models.Book.objects.defer(‘title‘)  # defer与only是相反的
for r in res1:  # defer会将不是括号内的所有的字段信息 全部查询出来封装对象中
     #一旦你点击了括号内的字段  那么会频繁的走数据库查询
    print(r.price)

总结:用only它会帮你拿到括号内的字段的数据放在一个对象里面,当你拿该字段的数据时就不会再走数据库查询了,但如果你要那其它字段的数据,还是会去数据库查询,而defer与only是完全相反的,defer做的事情则是把你不是括号中字段的数据拿到,封装在对象中,如果你要拿一个不是括号内字段的数据时,它就可以直接而给,而不再去走数据库,如果括号内字段数据的话,它会帮你去数据库查询。

select_related与prefetch_related

select_related帮你直接连表操作 查询数据   括号内只能放外键字段
res = models.Book.objects.all().select_related(‘publish‘)
for r in res:
    print(r.publish.name)
res = models.Book.objects.all().select_related(‘publish__xxx__yyy__ttt‘)
print(res)
res = models.Book.objects.all()
"""
select_related:会将括号内外键字段所关联的那张表  直接全部拿过来(可以一次性拿多张表)跟当前表拼接操作
从而降低你跨表查询 数据库的压力

注意select_related括号只能放外键字段(一对一和一对多)
res = models.Book.objects.all().select_related(‘外键字段1__外键字段2__外键字段3__外键字段4‘)
"""
prefetch_related  不主动连表
res = models.Book.objects.prefetch_related(‘publish‘)
"""
不主动连表操作(但是内部给你的感觉像是连表操作了)  而是将book表中的publish全部拿出来,在取publish表中将id对应的所有的数据取出
res = models.Book.objects.prefetch_related(‘publish‘)
括号内有几个外键字段 就会走几次数据库查询操作
"""
for r in res:
    print(r.publish.name)

总结:

1、select_related是主动连表操作,它的作用其实就是把你括号内的外键所关联的表和你当前这张表拼接起来,变成一张表,相当于拿到了所有的数据,你想查谁就能查谁,如果你关联外键的那张表里也有外键,你可以在括号里写当前这张表的外键之后双下划线然后写那张表的名字(例如‘外键1__外键2__外键3__外键4‘),这样的话就是把这几张表全部拼接在了一起,这个的本质其实就是通过sql的join来优化查询,从而减少sql查询次数。

2、prefetch_related是不主动连表操作,它的本质其实是分别拿到两张表,然后通过python来处理表的关系,并将对应的数据拿出来封装到一个对象里,也可以让你用点操作拿出来,它看起来也像是连表操作。

事务

本质和mysql的事务差不多

也拥有ACID四大特性:原子性、一致性、隔离性、永久性

from django.db import transaction

with transaction.atomic():
    """数据库操作
    在该代码块中书写的操作 同属于一个事务
    """
    models.Book.objects.create()
    models.Publish.objects.create()
    # 添加书籍和出版社 就是同一个事务 要么一起成功要么一起失败
print(‘出了 代码块 事务就结束‘)

原文地址:https://www.cnblogs.com/AbrahamChen/p/11567328.html

时间: 2024-08-29 17:23:29

数据库优化查询的相关文章

数据库优化查询的方法以及大访问量到数据库时的优化

一.数据库优化查询的方法 1.使用索引: 应尽量避免全表扫描,首先考虑在where 以及 order by  ,group  by 涉及的列上建立索引 2.优化SQL语句: 1>通过explain(查询优化神器)用来查看SQL语句的执行效果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句.通常我们可以对比较复杂的尤其是涉及到多表的SELECT语句,把关键字explain加到前面,查看执行计划,例如: explain select * from news; 2>任何地方都不要使用sel

orm常用字段和数据库优化查询

一.Django ORM 常用字段和参数 1.常用字段 models中所有的字段类型其实本质就那几种,整形varchar什么的,都没有实际的约束作用,虽然在models中没有任何限制作用,但是还是要分门别类,对于校验性组件校验非常有用就比如说邮箱类型,你在输入邮箱的时候如果不按照邮箱格式输入,瞎鸡儿输入会提示你不合法,虽然输入的是字符串,但是不是规定的邮箱字符串 AutoField() [int primary key auto_increment)] int自增列,必须填入参数 primary

MS数据库优化查询最常见的几种方法

1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3.没有创建计算列导致查询不优化. 4.内存不足 5.网络速度慢 6.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7.锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8.sp_lock,sp_who,活动的用户查看,原因是读写竞争资源. 9.返回了不必要的行和列 10.查询语句不好,没有优化 可以通过如下方法来优化查询 1.把数据.日志.索引放到不同的I/O

数据库优化查询相关

only与defer orm内所有的语句操作都是惰性查询:只会在你真正需要数据的时候才会走数据库,如果你单单只写orm语句时不会走数据库的,这样设计的好处在于减轻数据库的压力 res = models.Book.objects.all() print(res) res = models.Book.objects.values('title') print(res) for r in res: print(r.title) res = models.Book.objects.only('title

数据库优化查询方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引 2.应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描 3.任何地方都不要使用select * from t,用具体的字段列表代替“ * ”,不要返回用不到的任何字段 4.尽量避免大事务操作,提高系统并发能力 5.尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理 原文地址:https://www.cnblogs.com/Fairy-Prin

mysql数据库优化之表的设计和慢查询定位

一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入合适的索引.怎样使用索引 3.分表技术(水平切割.垂直切割) 4.定时清除数据垃圾,定时碎片整理 5.多用存储过程和触发器 6.对mysql配置进行优化 7.读写分离 8.mysqlserver硬件升级. 二.数据库的设计 步骤: 1.收集信息:与该系统有关人员进行交流.充分了解数据库须要完毕的任务

数据库常用查询语句写法(优化)

常用查询写法 Like like本身效率就比较低,应该尽量避免查询条件使用like: 原因: 对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低: 由于匹配算法的关系,模糊查询的字段长度越大,模糊查询效率越低. 解决办法: 尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至少保证不要使用全模糊查询,对于右模糊查询,即like '-%',是会使用索引的: 左模糊like'%...'无法直接使用索引,但可以利用reverse + function ind

mysql数据库优化 开启慢查询

Mysql数据库优化 一.sql及索引优化 如何发现有问题的sql?使用mysql慢查询日志对有效率问题的sql进行监控 //查看是否开启慢查询日志show variables like 'slow_query_log' set global slow_query_log =on;//开启慢查询 //设置保存慢查询日志路径set global slow_query_log_file = '/var/lib/mysql/slow_log.log'; //记录下没有使用索引的query,show v

转载:30多条mysql数据库优化方法,千万级数据库记录查询轻松解决

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描, Sql 代码 : select id from t where num is null; 可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询: Sql 代码 : select id from t where num=0; 3.应尽量避免在 wh