数据库优化常用技巧

来源:互联网 发布:淘宝开店宝贝照片拍摄 编辑:程序博客网 时间:2024/05/16 19:35

1、SQL语句的优化
在应用开发过程中,由于初期应用数据量小,开发人员写SQL语句的时候,只注重了基本功能的实现,但是应用系统正式上线后,随着用户数量的增长,很多SQL语句开始逐渐显露出性能问题,并且影响越来越大。

方法1: 选择合适的字段属性
数据库表可以存储大量的数据,一般情况下表越小,查询的效率就越高。所以为了提高查询效率,对表的定义的时候,需要对表的字段属性进行充分考虑,不能过多的设置,浪费资源。 可以减少数据库的磁盘IO操作,提高数据库的查询效率。

【强制】如果存储的值字符长度差不多,那么对字段值定义最好使用char。因为char是定长的。varchar是变长的,不预先分配存储空间。并且存储长度不要超过5000,如果存储长度超过此值,那么定义类型为text,并且单独出一张表来,使用主键来关联,避免影响其他字段的索引效率。
【强制】如果单表数据量超过500万,才需要考虑分库和分表。

sql的执行计划:Explain分析sql的执行计划

2、索引问题:
索引是数据库优化中最常用也是最重要的手段之一,通过索引可以帮助用户解决大多数的SQL性能问题。从索引的分类、存储、使用方法等维度来考量。

【注意】在表中对多个字段创建唯一性约束,并不是一个很好的防止脏数据的办法。会影响数据插入的效率,因为没插入一条数据,数据库中会进行全表查询,判断数据是否存在。如果不存在,再插入,如果数据量大的时候,势必会影响效率。
这里写图片描述

上面截图是从阿里对外发布的java规范手册中索引部分的截图。从截图中可以看出,以前通过代码来判断,必然是可以的。但是其实我们错了。对插入效率的影响是可以忽略不计的。

【强制】超过三个表,禁止join。
【强制】对于索引字段严禁使用模糊搜索,因为索引文件具有BTREE树的最左前缀匹配规则。如果左边的值没有确定,那么索引是会失效的。like %“ABC”,可以使用instr() 字符串函数表达式。
【强制】利用覆盖索引来进行查询,可以避免回表查询。
说明:假设如果要查看11页的标题,可以直接通过目录去查看。不需要翻到11页。因为目录中就包含了标题。覆盖索引就是,创建的索引的字段就是要查询的字段。能够建立索引的种类:主键索引、唯一索引、普通索引、文本索引、组合索引、覆盖索引等。
【强制】当偏移量很大的时候,查询效率明显会变慢,这时候需 要对分页查询进行优化。
说明: 分页查询limit 10000,20。
优化分页查询的两种方法:
1) 子查询 。
2) 采用了覆盖索引的延迟关联查询
【强制】创建组合索引的时候,区分度最高的在最左边。
说明:这是由于索引的最左前缀特性。
【强制】并不是所有的列都适合创建索引,比方说枚举列。
如果某列的值分布均匀,那么最适合创建索引。

3、定期分析表和检查表,定期优化表

4、优化数据库对象
在设计表的时候,存在如此顾虑,表中字段设计长度如何为合适。表的数据类型的设定,表的拆分(垂直和水平)、使用中间表、

5、锁对象的优化
锁问题,锁的竞争,表锁和行锁。
事务和事务的隔离级别。
事务的划分等操作。