如何设计一个日访问量千万级别的系统,谈oracle的高级设计和开发(1)

假如要开发一个日访问量百万级别、甚至千万级别访问量的互联网平台,性能和安全是首要考虑的因素。单从性能上讲,主要从以下几个方面考虑:

1)       硬件及网络设备;

2)       分布式、集群、读写分离、CDN加速等;

3)       使用优秀的开发框架,充分利用缓存机制;

4)       良好的数据库设计规划,包括数据库集群,关系型数据库+非关系型数据库结合;

5)       高性能的开发语言编程,特别是数据库部分的编程;

等等。

 

建设一个中大型互联网平台,是有技术含金量的,抛开硬件、网络环境不说,系统的性能很大程度上取决于系统构建是否合理,系统的设计是否优良,其中数据库端的设计和开发又是关键中的关键。

本人一直从事互联网平台的开发,也经常参与公司技术人员面试工作,针对数据库(oracle)部分我通常会问对方二个问题:

1)       请说明char(10)varchar2(10)nvarchar2(10)的区别;

2)       请说出十种以上对性能优化有影响的做法。

面试下来的结果往往让人失望,真正能将这两个问题回答比较好的凤毛麟角,这主要是因为即使是有很多工作经验的开发人员,能有机会接触大一点的互联网平台的机会并不多,更多的是做一些企业管理系统,几十个,几百个使用用户的平台,现在的服务器性能完全可以弥补设计上性能缺陷的不足。

 

为了能向高手们学习,针对oracle的设计及开发领域,本人将十来年互联网项目建设经验和大家分享,不当之处,请指出,大家相互交流学习。

 

开篇之前,先简要回答上面两个问题。

问题1char(10)varchar2(10)nchar(10)nvarchar2(10)的区别?

Char类型是定长的,不管你是存3个字母还是9个字母,char(10)都是存储10个字节,不够的部分用空格补充;varchar2(10)类型变长,存3个字母就是占三个字节。

错误观点:varchar2类型完全可以替代char,能有效节省数据的存储空间。

纠正:虽然从存储空间的角度考虑,varchar2确实比char合理,但系统在处理变长类型时,需要额外的资源开销,当然这种开销是非常微小的,可以忽略,但当数据量大,需要处理的数据多时,累积的开销就不能忽略了。因此,当业务明确字段长度时,应该明确定义为char类型,如邮政编码char(6)、性别char(1)[F表示女,M表示男]

Nvarchar类型是针对不同字符集存储的字节数不同而产生的。假如要存放最多10个中文,那么就应该定义为Nvarchar2(10),而不是varchar2(20),因为在UNICODE下一个中文由2个字节表示,但编码为UTF-8时,很可能是3个字节,导致varchar2(20)无法存储10个中文。当需要存放中文内容的时候,建议定义为ncharnvarchar2类型。

 

问题2)请说出十种以上对性能优化有影响的做法。

A)有效定义索引

B)普通表数据对应的表空间和索引表对应的数据表空间分离

C)数据量大的表做分区表设计

D)数据量大的表,依据业务实际情况分拆为当前表和历史数据表

E)字段多的大表依据业务实际情况分拆成多个表

F)合理的字段设计,如能char(2)的就不要定义为char(4),能number6)明确定义的就不要定义为numbernumber10,要记住1000万条记录的表,一个多一个字节就是多10M

G)合理利用oracle的缓存区,如将频繁访问的基础表数据加载到内存中

H)尽量减小事务的粒度

I)合理使用物化视图

J)必要时可以考虑表的压缩属性

 

待续。。。


本文出自 “知行合一” 博客,请务必保留此出处http://connieguo.blog.51cto.com/9959230/1617573

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。