数据库软件是server端数据存储、查询的抽象层,是数据与计算分离的设计典范。因为其实现的专业化和复杂度,如何正确使用或者优化数据库的访问对大多数web开发者都是一个极大的挑战。这里尝试从应用程序开发者的角度总结一下数据库使用和优化须要注意的一些问题,不求大而全,但求准确有效。html
Five steps to postgres performance 总结概括的很好,从5个层次来分析影响数据库性能的因素。mysql
服务器应用开发者常常接触的是application和middleware两个层面,这也是我关注的重点,其余简单涉猎一下。程序员
这部分其实就是web开发者直接控制的部分,在编程访问数据库的时候到底要写代码才能作到高效呢?从应用层面,咱们能够注意如下这些地方:web
数据库表的设计要合理
这是最体验架构功力的地方,不同的问题不同的设计。这里无法总结通用法则,只能提醒本身设计出来的表考虑好性能与知足1/2/3NF/BCNF范式作好平衡,具体数据库的设计范式是个让人头大的知识点,贴个连接常常翻翻吧,数据库范式。尽可能往高级的范式靠拢以达到尽可能小的数据冗余,这样常常会致使不少小表的联合查询,若是实在影响性能能够增长冗余来得到快速的查询。sql
合理使用索引
索引是个性能利器,但要用之有度,滥用有害:数据库
foreign和unique通常自动索引express
查询语句中出现的域通常加索引编程
考虑使用不一样类型的索引:expressions, full text, partial性能优化
更新、插入、删除等写操做频繁时慎用索引服务器
小表不必索引
取值范围小的域加索引意义不大
分表、分库和分区
分表和分库相似,只是操做的实体不一样。策略上分为水平切分和垂直切分,但都须要application作相应的适配。具体实际操做自行google吧。分区仍是保持单个表的存在,只是把表分红不少小块,而后能够把这些块存在不一样的硬盘区域。分区通常是DBA作的,对应用开发透明,不须要应用来适配。
sql操做的优化
尽可能合并操做
慎用外键,看是否程序保持关联更高效
拒绝select *,指定须要的列名
用in代替or
若是使用ORM (object relational mapping)框架,能够转成sql语句再调性能
使用cache
cache用的好能够极大的提升服务响应速度,减轻数据库的压力,由于你根本没去查数据库。cache说开了去,不少地方均可以应用,这里单看一下server应用程序这一块。
应用程序大量使用cache,减小访问db,能够cache整个页面、函数或单个对象或数据
使能数据库cache
控制管理数据库的链接数
每一个进程与数据库server通讯都经过一个独占的链接,链接是有开销的,再多进程编程中要注意控制这个开销。
大多数状况下,web开发者不关心或者也不必涉及到这部份内容。做为一个完整的总体,了解这部份内容有助于理解整个系统是怎样工做的。
硬件
web服务器软件和数据库软件,对于硬件资源的消耗主要是CPU、RAM、本地IO和网络方面。在搭建本身的服务器时,根据本身的可提供的服务规模能够大致估算出须要什么型号和多大的CPU、RAM、磁盘、网络带宽。知足定义的最大容量的基础上,考虑多一些冗余。从性能上讲,要考虑CPU IO在各级的性能表现,贴一个大概的IO表现。
操做系统和文件系统
通常的web服务器程序不用考虑对操做系统和文件系统作特殊的调整或优化,但有些重度依赖数据的应用好比数据仓库会考虑作这方面的工做。
文件系统选XFS & JFS或者Ext3, 减小log “-data=writeback, noatime, nodiratime”
数据库log文件使用单独的文件路径甚至磁盘
调大shmmax/shmall in kernel以得到更多共享内存
OS版本2.6.9的表现很差
设置开启性能监控,监控CPU/ram/disk/network的使用状况
数据库配置
这是DBA(数据库管理员)的本职工做,不一样的数据库配置也不尽相同。其实这部分过于复杂,直接跳过。通常状况下使用默认的推荐配置,有问题再查资料调整。随手贴个oracle的架构,帮助我理解一次数据读写大概怎样完成的。
有必要强调一下方法论,避免头痛医脚、南辕北辙的笑话。你走到数据库优化这一步,务必肯定是你benchmark并分析过认定数据库的操做是瓶颈,不然不要想固然的认为这里有问题,极可能只是你的想象,并不真正解决问题。这种事情一直再发生,我本身也常常犯这样的混。
若是确实是数据库的瓶颈,咱们以postgresql为例看有哪些有效的方法呢。
benchmark->分析->修改尝试->benchmark->...不断的重复这个闭环。最重要的是第一步,postgresql performance monitoring这里总结了不少方法。
前面提到了很多建议和规则,更多的能够参考阅读:
Best Practices for Speeding Up Your Web Site
20 database design rules
Database optimization techniques you can actually use
面向程序员的数据库访问性能优化法则
high-performance-mysql