|
本帖最后由 z2chen 于 2012-9-24 12:14 编辑
根据我做开发的经验,发现很多很多的问题其实都能用很少的资源就能完成,可惜大家写程序的时候都不愿花时间去想,程序都是随手就写出来的,
只要能运行,正确,就可以了。还有很多人则醉心于clean code, pattern. 对花少资源办大事根本不感兴趣,大部分不了解数据库的程序员,认为内存,硬盘现在不值钱。
结果往往就是用户多了,功能多了,系统动不了了,才开始想办法。 我也是一边做,一边想,有一点点心得,简单写出来,希望能抛砖引玉。
1,减少没有必要的读写。
a)网页设计要合理,大多数用户用不到的东西就不要写进去, 少数用户用到的东西,就去另外的页面。 没有必要的功能就不要加进去,少就是多。
b) 在程序中严格控制对数据库读写的操作,例如不能在循环里面做数据库操作。只允许用batch 和 bulk对数据库操作。
c)每次读取的数据要控制,不能因为每次读的数据太少而动不动的就去数据库读。 也不允许把太多的数据一起载入程序内存,这样会把真正有效用的多的数据踢出内存跟缓存,同时加大了数据库的压力。
d)分析用户数据,把一些用户共享的,不经常改变的数据,放在缓存中,用户使用的时候就没有必要去数据库查询了,尽可能的减少数据库的操作。 如何高效利用缓存上多下工夫。
e)能在客户端运行的(or web server,app server),就少让他们在数据库里运行. 不该这个数据库管的东西,就去别的服务器上查询,不要把什么都写在自己的数据库里。当然也有时候用SP效率很高,性价比高,就放在数据库做,有query plan等,便于调优。
f)把对数据库的insert,update尽量放在程序transaction的最后,一次搞定, 不要反复存取,修改再修改。之前的操作在内存里完成。
2,加快或减慢对数据库的操作。
a)分析用户使用习惯,看看有哪些任务没有必要当下必须完成的,就把他们积累起来,等系统不忙的时候做。哪些任务是用户常用到的,想法子提前做完。 减少高峰期瞎忙。
b) 有些必须当下完成的,做个评估系统,简单的就马上做,复杂的就async.放到queque里, 根据数据库繁忙程度几个几个的来,不要搞垮服务器。
c) zip往来的数据。
d) 有些情况可以考虑多线程的处理一个用户的需求,让他完成工作,早点离开系统, 如果可能的话。
3, 让数据库快点处理数据。假设是OLTP
a) 让数据库读写的快些,合理设计表,主要业务的join不要多于4个。
谨慎选择index,控制数量最好不要多4个。谨慎设计clustered index.
b)注意优化SP,多用一些小的set,没有必要的数据在sp的前面就过滤掉。
c)合理的用isolation level,减少blocking.
d) 还是batch and bluk,寻求之间的平衡点。
f) 根据具体情况调整数据库的使用,partition? fulltext search engine? read-only replica? outsourcing file db?
|
|