如何在高用户量,高并发的情况下,还能保证高效的运行,这是更难于解决的,需要我们下更多功夫所在的地方。
下面从数据库的设计到应用两个方面来提一些作为我们程序员可以改善的地方。
1、设计
1,首先就是范式的灵活运用,一般情况下三范式是我们设计数据库所要遵循的原则。但是我们需要根据实际情况实际对待,有时候适当的冗余字段,减少表之间的连接,反而会大大提高查询效率。
2,索引的建立:索引需要建立的适当,应该对常查询的表中添加索引,而不要一味盲目的使用索引,因为要是维护索引的付出小于他的回报,那么就没有意义,反而更加麻烦了。
3,对表进行划分:这里想提一下水平划分,垂直划分和时间轴划分
水平划分:就是根据某个字段将表分成若干个表。例如在学生管理系统中,可以根据学院将学生信息表划成更多张。这里想提的就是对表进行划分的粗细程度,根据数据量,查询频率等进行划分,找到一个最恰当的粒度,还是需要开发者有很高的水平的。
垂直划分: 这里其实就是三范式的灵活运用,例如还是学生信息表,还可以划分为学生基础信息表,和学生获奖信息表等,还是根据查询使用的字段进行划分,方便我们对数据的处理即可。
时间轴划分:这种情况是针对信息的产生量过大的情况下,例如每天有大量的信息收集,我们可以根据月,周,天甚至小时进行对表划分。因为一些历史信息我们很少情况下才会用到的,这样我们保证最新信息的查询高效更重要。
4,字段的类型选择要恰当:这里包括字段的长度,类型等,要根据实际存储的数据进行选择,长度不要过长,否则会大大影响效率。
5,外键要慎用:因为主键代表着一张表,而外键就代表着一群表,对表与表之间进行了关联,一表动就会引起另一张表的。有的情况下我们甚至可以不适用外键,及时有这种关系,我们通过sql语句进行关联即可。
二,操作数据库:
1,尽量多使用PrepareStatement,少用Statement。因为PrepareStatement是进行预编译的,对于同类型的sql语句编译一次即可。提高了效率。
2,Connection设置为readOnly,Connetion是对数据库的连接,属于重量级的,我们只是使用它即可。
3,当然了紧跟着就是连接池(Connection pool)的使用,提前准备好一定数量的数据库连接,这样会大大提高我们队数据库的访问速率。这里需要提一下MySql提供的数据库连接池默认的为100个connection。Oracle10g默认的是150个连接数。
4,在jdbc中采用批量(batch)处理,可以减少数据库的访问次数,这样也会大大提高效率。
5,sql语句的编写,减少嵌套查询的使用,减少group和having子句的应用。
6,利用视图(View),采用数据库本身机制进行分页查询,提高性能。
……
如有好的优化方法,请指教!!!