假如要开发一个日访问量百万级别、甚至千万级别访问量的互联网平台,性能和安全是首要考虑的因素。单从性能上讲,主要从以下几个方面考虑:
1) 硬件及网络设备;
2) 分布式、集群、读写分离、CDN加速等;
3) 使用优秀的开发框架,充分利用缓存机制;
4) 良好的数据库设计规划,包括数据库集群,关系型数据库+非关系型数据库结合;
5) 高性能的开发语言编程,特别是数据库部分的编程;
等等。
建设一个中大型互联网平台,是有技术含金量的,抛开硬件、网络环境不说,系统的性能很大程度上取决于系统构建是否合理,系统的设计是否优良,其中数据库端的设计和开发又是关键中的关键。
本人一直从事互联网平台的开发,也经常参与公司技术人员面试工作,针对数据库(oracle)部分我通常会问对方二个问题:
1) 请说明char(10)、varchar2(10)和nvarchar2(10)的区别;
2) 请说出十种以上对性能优化有影响的做法。
面试下来的结果往往让人失望,真正能将这两个问题回答比较好的凤毛麟角,这主要是因为即使是有很多工作经验的开发人员,能有机会接触大一点的互联网平台的机会并不多,更多的是做一些企业管理系统,几十个,几百个使用用户的平台,现在的服务器性能完全可以弥补设计上性能缺陷的不足。
为了能向高手们学习,针对oracle的设计及开发领域,本人将十来年互联网项目建设经验和大家分享,不当之处,请指出,大家相互交流学习。
开篇之前,先简要回答上面两个问题。
问题1)char(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个中文。当需要存放中文内容的时候,建议定义为nchar或nvarchar2类型。
问题2)请说出十种以上对性能优化有影响的做法。
A)有效定义索引
B)普通表数据对应的表空间和索引表对应的数据表空间分离
C)数据量大的表做分区表设计
D)数据量大的表,依据业务实际情况分拆为当前表和历史数据表
E)字段多的大表依据业务实际情况分拆成多个表
F)合理的字段设计,如能char(2)的就不要定义为char(4),能number(6)明确定义的就不要定义为number或number(10),要记住1000万条记录的表,一个多一个字节就是多10M
G)合理利用oracle的缓存区,如将频繁访问的基础表数据加载到内存中
H)尽量减小事务的粒度
I)合理使用物化视图
J)必要时可以考虑表的压缩属性
待续。。。