数据库优化方案

当数据量大时,就需要对数据库进行优化来提高查询或者插入数据的效率,尤其是提高查询的效率。

针对提高查询效率可以有一下几个方面的优化:

1,提高数据库服务器的硬件配置,增加网络带宽提高数据传输效率,但是成本比较高,时间久了效率问题还会出现。

2,优化数据表结构减少数据冗余。

3,创建合适的索引。

4,优化sql语句编写。

5,读写分离,读服务器和写服务器实现数据同步。

6,增加Redis服务器,将常用但不经常修改的数据放在Redis上。

以上几点中,最长用到的就是2-6。但是在数据量增多后,就经常需要优化sql语句提高查询效率。但是优化sql语句却又

和索引有着很大的联系,下面将一一进行阐述。

sql语句编写要点:

1,尽量使用exists ,not exists 代替in,not in。

2,尽量不要使用select * from table。用到哪些字段就返回哪些字段。

3,尽量把字段的长度保持在合理区间。例如,name字段可以设置成varchar(20)而不要设置成varchar(50) 。

4,不要频繁的创建和删除临时表,容易引起性能问题。

5,尽量避免大事务操作,提高系统并发性。

6,尽量用where代替having。因为having会查询所有信息后进行筛选过滤,而where只会查询符合条件的数据,这样

减少了性能损耗。

7,在连接多个表时,尽量使用表的别名.字段格式,这样可以减少解析时间。

8,在oracle数据库中尽量使用大写字母编写sql语句,因为oracle数据库会先把小写字母转换成大写字母再执行。

9,尽量使用>=代替>,因为select * from user where uid>=5中首先定位到uid=5的数据行,而uid>4则会定位到uid=4

的数据行,然后再向下搜索第一个>4的数据。

往下的规则都与索引有关

10,再查询时避免对整个表进行查询,可以在where或者order by的字段加上索引。

11,避免在where 或者order by字段进行is null 判断,这样会导致数据库引擎放弃索引而进行全表搜索。对于这种情况数字类型可以设置0,字符串可以设置成""空字符串。

12,where 或者order by后的子句中应该避免对字段进行表达式的操作,这样也会导致放弃索引全表搜。例如num=100*2而不要num/2=100。

13,索引并非万能的,它也带来了存储空间的浪费来存储索引文件,并且每次insert,update,delete都需要修改索引文件,也会带来更多次的I/O操作。

14,不要对索引字段进行函数操作,也会导致放弃索引全表搜索。

15,在where子句中,过滤掉最大数量的查询条件必须放在where语句的最末尾,因为sql语句是自下而上执行的。

16,当索引含有多个列时,只有第一个列被where使用时才会调用索引,但是其他列就不会调用索引。

17,表的关联尽量使用主键。

18,尽量避免使用like "%abc%"这种模糊查询。因为这样的查询也会放弃索引而进行全表查询。类似的还有"%abc",但是可以这样“abc%”。

19,在sql语句中尽量使用变量的方式设置参数。例如,stringsql="select * from user where uid=?";和stringsql="select * from user where uid="+id。这两种方式中,数据库对sql文的解析和执行计划会缓存起来。但是第二种方式每次id变化都会重新缓存,所以第二种方式对影响执行的效率。


注意:

exist与in的区别和关系,如何更高效的使用:

in是把内表和外表做hash连接。exist是对外表做loop循环,每次循环完毕后再对内表进行查询。所谓外表就是主查询的表,内表即是子查询的表。也就是说in 用到了外表的索引,exist用到了内表的索引。所以说如果两个表的数据量差别比较大的时候,内表数据量大,那么使用exist效率更高。相反外表(主表)数据量大的时候使用in效率更高。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值