时间:2021-07-01 10:21:17 帮助过:28人阅读
一个功能的实现简单,但是一个功能能够在满足用户体验度的情况下实现就不是都那么容易了。例如在评教系统中,在考试系统,在选课系统中,甚至高一点到我们的12306系统中,如何在高用户量,高并发的情况下,还能保证高效的运行,这次是更难于解决的,需要我们下
一个功能的实现简单,但是一个功能能够在满足用户体验度的情况下实现就不是都那么容易了。例如在评教系统中,在考试系统,在选课系统中,甚至高一点到我们的12306系统中,如何在高用户量,高并发的情况下,还能保证高效的运行,这次是更难于解决的,需要我们下更多功夫所在的地方。
这里从实际项目开发中,提取一点经验,虽然看似小,但是做好了,却会对效率有很大的不同,这里从数据库的设计到应用两个方面来提一些作为我们程序员可以改善的地方。
一,设计:
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),采用数据库本身机制进行分页查询,提高性能。
……
综上为数据库方面的优化,虽然提到的点都是比较小的,但是都是非常使用的,实在我们开发中可以很容易控制的,只要我们多用心,多思考,多联系实际情况,会在数据库效率方面大大提高的。很多需要靠我们经验来进行处理,所以经历过会收获很多的……积累……