1、大规模网站下的数据库云组:刘欣明 PHP facebook,yahoo Java taobao,163 Python google语言不是可伸缩性的关键,架构才是关键!大规模网站瓶颈 数据库 HTML静态化 缓存,负载均衡 图片服务器分离 数据库集群和库表散列数据库设计1.WEB应用和数据库部署在同一台服务器上2.WEB应用和数据库部署在各自独立的服务器上3.数据库服务器采用集群方式部署(比如Oracle的一个数据库多个实例的情况)4.数据库采用主从部署方式 5.数据库垂直分割6.数据库水平分割 WEB应用和数据库部署在同一台服务器上 一台服务器Web应用 数据库WEB应用和数据库部署在各自独
2、立的服务器上一台服务器第二台服务器Web应用数据库数据库服务器采用集群方式部署DBDBDBDB(镜像)客户端数据库采用主从部署方式 主从复制(二进制日志文件形式)数据库采用主从部署方式 读写分离数据库采用主从部署方式 反向代理数据库采用主从部署方式 好处一:实现服务器负载均衡 好处二:通过复制实现数据的异地备份 好处三:提高数据库系统的可用性数据库垂直分割数据库水平分割1.余数分区 将User_ID%10后的值为依据存入到不同的分区数据库中2.范围分区 User_ID的范围进行分区,比如1-100000范围为一个分区数据库,100001-200000范围为一个分区数据库3.映射关系分区 将对分
3、区索引字段的每个可能的结果创建一个分区映射关系数据库垂直+水平分割基于ORM缓存的数据库表设计 以减少数据库服务器IO为最终目的,而不是减少发送到数据库的sql条数。尽量避免多表关联查询,尽量拆成多个表单独的主键查询。基于ORM缓存的数据库表设计 举例:blogs,blog_contents,accounts 比较:Select blogs.*,blog_contents.content,account.name from bogs left join blog_contents on blogs.blog_content_id=blog_contents left join accounts
4、 on blogs.account_id=account.id;第一步:分布查询 Blogs=Blog.order(id desc).page(params:page);第二步:主键查询(利用缓存直接获取)Select blog_contents.*from blog_contents where blog_contents.id=29;Select blog_contents.*from blog_contents where blog_contents.id=28;Select blog_contents.*from blog_contents where blog_contents.id=27;基于ORM缓存的数据库表设计拆分column而非row实现细粒度对象缓存方式一方式二将大字段拆分出来,放在一个单独的表里面,表只有主键和大字段,外键放在主表当中;将不参加where条件和统计查询的字段拆分出来,放在独立的表中,外键放在主表当中。按照column拆表本质上是一个去关系化的过程。主表只是保留参与关系运算的字段,将非关系型的字段剥离到关联表当中,关联表仅允许主键查询,以key-value DB的方式来访问。idauthoridtimecontentidauthoridtimecontentididcontent