Asp.Net 网站优化系列之数据库优化分字诀上 分库

 更新时间:2010年06月09日 20:23:04   作者:  
当我们的数据量很小的时候,我们会把用户表,博客表,论坛表,闪存表等等都砸在一个库里,我们的业务增长的很好,在不久之后我们尽力的优化了查询,但是效果依然不佳,这时候用分字诀的时机到了。
如果你有先见之明的话,会给表名,存储过程的名字加上前缀,例如论坛表命名为BBS_xxx,博客表命名为BLOG_xxx;这样的话在分表处理时会比较容易一些。说到这儿也许你会想到外键约束怎么办,我的博客表,论坛帖子表都有用了User表的主键做外键呀。这个很容易处理,我们需要当机立断的删掉外键,这个当机立断可能会带来一些麻烦,我们来分析下可能会遇到一些什么问题:

1. 分成多个库,没了外键了以前的inner join操作要跨库吗?

假定场景:博客表有对用户表的外键引用,我们需要在首页显示博客列表,博客列表需要显示用户名和用户id的信息

之前用户表,博客表在一个库里面的时候我们可以通过外键inner join来取得用户的关联信息,现在用户库和博客库被拆成了两个库,我想对跨库做inner join说no;为什么呢,因为这不适合扩展,假如有一天我们的业务量又增长了我们就需要把用户库挪到另外一台机器上,这要导致inner join跨服务器了,这显然不是一个好办法,那该怎么办呢? 我有两种方案,大家评判好坏:

1)做违反范式的设计,将用户的不变信息用户名和用户id一起存在博客表中,让用户名冗余吧,这样做可以保证取博客数据连带用户名时是非常高效率的

2)我们不再从数据库中取用户名的信息,改从缓存中取,我们可以在缓存中形成一个最近活跃的用户数据池,当我们需要用户名时从这个缓存区中去取。

目前在我的应用中用的是第一种方案,第二种更有伸缩性,第一种存冗余数据只能存用户名,有时候只存用户名就够了,有时候可能会出现不够的问题。

2. 如果用到了根据外键做的级联删除,那这是一个噩梦

对付这个问题,我的方案是修改程序,如果需要级联删除,在程序逻辑中完成,不要在数据库做级联删除了,级联删除是一种隐含在数据库中的逻辑,是一种不好的设计方案。

3. 触发器也可能带来和外键做级联删除同样的麻烦,同样的也是修改程序逻辑,代替这种数据库级别的隐含逻辑。

也许你会说分库之后一定会带来性能的提高吗?这个问题得具体分析,这要看你的服务器性能如何,如果分库之后数据库的cpu,io,内存的压力依然很大;那么您可以将分库之后的其中某一个库迁移到另外一台服务器上,让两台服务器分摊数据访问的压力,肯定会提升性能的。

最后说下,分库分与不分是由数据量、性能要求决定的。下篇分表敬请期待!

相关文章

  • asp.net 开发的一些常用技巧

    asp.net 开发的一些常用技巧

    asp.net开发过程中,发现的一些不错技巧,能用的到的朋友有福了。
    2009-07-07
  • asp.net sql存储过程

    asp.net sql存储过程

    在ASP.Net项目中使用存储过程,首先可以提高数据库的安全性,其次可以提高运行SQL代码运行的速度,在大型项目中一般是必不可少的。
    2009-11-11
  • 关于两个自定义控件的取值问题及接口的应用

    关于两个自定义控件的取值问题及接口的应用

    一个.aspx的页面中,用到了两个用户控件,其中想做的到A控件有一个按钮,点击的时候获取到B控件中的一个textbox的值想必大家会使用findcontrol获取控件吧,而在生成的时候名字是不确定的,那么如何书写呢?接下来为您提供详细的解决方法,感兴趣的朋友可以了解下啊
    2013-01-01
  • ASP.net连接Excel的代码

    ASP.net连接Excel的代码

    ASP.net连接Excel的代码,这个是asp.net操作excel必须知道的基础,另外的技巧可以参考脚本之家之前发布的文章。
    2010-03-03
  • Request.QueryString与一般NameValueCollection的区别

    Request.QueryString与一般NameValueCollection的区别

    最近在做一个搜索程序的优化改进,将搜索结果按照查询的参数不同进行缓存。缓存的Key很自然的就想到了用查询字符串,而获取查询字符串的最简单方式是通过Request.QueryString.ToString()方法
    2011-12-12
  • .Net之微信小程序获取用户UnionID的实现

    .Net之微信小程序获取用户UnionID的实现

    这篇文章主要介绍了.Net之微信小程序获取用户UnionID的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • ASP.NET MVC下拉框联动实例解析

    ASP.NET MVC下拉框联动实例解析

    这篇文章主要为大家详细介绍了ASP.NET MVC下拉框联动实现方法,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • 先装了FRAMEWORK,后装IIS导致asp.net页面无法访问的解决方法

    先装了FRAMEWORK,后装IIS导致asp.net页面无法访问的解决方法

    如果先装了FRAMEWORK,后装IIS。有可能没有在IIS中注册,就会导致在页面中无法访问的情况
    2012-01-01
  • ASP.net Core微信平台开发配置Token

    ASP.net Core微信平台开发配置Token

    这篇文章主要为大家介绍了ASP.net Core微信平台开发配置Token有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • asp.net 获取银行货币汇率的代码

    asp.net 获取银行货币汇率的代码

    这个主要公司做外贸的每天都需要更新汇率,本来以前有一个服务可以调用,但是那个连接用不了 所以就写了一个这样的东西 套取网页显示信息
    2010-12-12

最新评论