数据库优化

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

会进行全表扫描的操作:使用 != 或 <> 操作符;使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描;

3. 表结构设计(选择合适的引擎、设计尽量符合三范式、字段尽量⾮

空。。、分表(⽔平分表、垂直分表)、分区)

a. ⽔平分表:数据量⼤了,拆分成多张表,不同⽤户访问不同的表(⼀

般使⽤hash,取模等⽅式进⾏表的拆分)

b. 垂直分表:把⼀张列⽐较多的表拆分为多张表,不常⽤的字段放在⼀

张表,经常组合查询的放在⼀张表

4、事务

尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

django中有三种事务用法

1,装饰器

@transaction.atomic

2,with语句

with transaction.atomic():

3,保存点

# 创建保存点

save_id = transaction.savepoint() 

# 回滚到保存点

transaction.savepoint_rollback(save_id)

# 提交从保存点到当前状态的所有数据库事务操作

transaction.savepoint_commit(save_id)

你可能感兴趣的:(数据库优化)