数据库性能优化的点滴

来源:互联网 发布:麦当劳开店条件知乎 编辑:程序博客网 时间:2024/04/27 21:12
使用java开发程序近两年,对于工作可谓得心应手。但我觉得仅仅是把东西做出来是远远不够的,曾在大学时候接触过算法,接触到算法的魅力,现在想想还是激动不已。本文并不是要展示本人的算法功底或是大谈特谈算法的神奇之处。只是想借算法之名透析我内心的想法:有时候一个好的设计或者是几行简单的代码往往能带来不可思议的效果。在此我想花点时间阐述对于数据库优化的一点点见解,它来自于我的工作积累、书籍以及大牛的博客。不久之前看过一本书,名为《Java程序性能优化》,该书中提到系性能优化的几个层次:1.设计调优;2.代码调优;3.JVM调优;4.数据库调优;5.操作系统调优。调优是一个恒久的话题,从系统的初步搭建到逐步成熟,中间或许经历多次变迁,我们要不断调整优化以保持系统的健壮性用来应对更加复杂的业务更加频繁的请求。调优是一个综合性的事情,包括了系统的各方面:网络、硬件、应用等,好的系统设计需要丰富的经验,没有最好的设计,只有最适合的设计。既然调优包括了这么多内容,我们该如何下手?上文提到的书中将讲到过一个概念:木桶理论,这个我相信大家都知道,一个系统的总体性能取决于系统最慢的环节。《Java NIO》从书的一开始就讲到I/O操作比在内存中进行数据处理任务所需时间更长,差别要以数量级计。事实确实如此,这也是缓存为何如此重要所在。下面将列出我对数据库优化的一点点见解,因为接触的系统没有所谓的高并发,所以有些理论是读博客文章之所得。鉴于经验不足,见闻鄙陋,不足之处还望见谅。写本文的目的只为了记录我的学习点滴,以及跟大家共勉,希望能给初学者以帮助,各位大神见怪莫怪。
(1):SELECT子句中避免使用*。stackoverflow中有一个探讨:Why is SELECT * considered harmful?
http://stackoverflow.com/questions/3639861/why-is-select-considered-harmful
(2):exists和in的比较:IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况,使用exists语句代替in语句,使用not exists代替not in 。
(3):使用truncate代替delete from 表语句(因为会清除所有数据,所以慎用),关于truncate和delete from的详细分析可参考博客:http://www.cnblogs.com/simplefrog/archive/2012/07/30/2615169.html
(4):减少访问数据库的次数,比如要更新多条语句或插入多条记录可用批量操作,效率会提升很多
(5):使用表的别名(Alias)
(6):尽快使用COMMIT
(7):数据库冗余字段的设计,有时候适当的使用冗余字段可有效地提升效率
(8):建立合理及有效的索引,关于索引,网上有很多分析的好帖,可移步赏析。
(9):图片,文件,二进制数据等数据尽量不要放到数据库,原文翻译链接:http://www.vaikan.com/three-things-you-should-never-put-in-your-database/
大型应用经常会用到以下技术,有兴趣的童鞋可以自行了解:
读 / 写分离
缓存:memcached等技术
拆分数据
 垂直拆分:把一个数据库中不同业务单元的数据分到不同的数据库里。
 水平拆分:是根据一定的规则把同一业务单元的数据拆分到多个数据库里。
对于不同的数据库也有不同的高性能优化原则,如oracle、mysql等。推荐两本书《MySQL高性能书籍_第3版》和《Oracle高性能SQL调整》
最后给大家推荐几篇精彩的文章:
关于大型网站技术演进的思考之存储系列文章:http://www.cnblogs.com/sharpxiajun/category/325369.html
0 0