当数据量大时,就需要对数据库进行优化来提高查询或者插入数据的效率,尤其是提高查询的效率。
针对提高查询效率可以有一下几个方面的优化:
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效率更高。