一种简单的数据库分流的算法及实现

本文介绍了如何通过简单算法将大型数据库分散成多个小型库,提高查询速度并分散服务器负载。方法包括按数字或字符串类型(如手机号、身份证号)划分,并提供了一段根据地域代码动态切换数据库连接的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

04年我在制作某省高考报名系统时使用过这种方法,效果很好但是源代码是基于2003的,今天已经不大适合了.
其实方法很简单:
1、目的:将一个大型数据库分散成几个小型的库,一方面加快查询速度,另一方面最主要的是能够将 数据库服务分散到几个不同的服务器上从而增强系统的反映能力。
2、方法:将数据库分散开,如果是连续数字的话,最好划分,例如手机号根据号段即可。身份证根据归属地,都可以。对于字符串类型的例如姓名等复杂一些,可以hash以后再想办法。
3、实际:该方法稳定可靠,我们已经在多个系统中使用多年没有出现过问题。
4、不足:分开的多个数据库如果需要合并统计时比较麻烦。
下边是该方法的具体代码:
1、首先应当配置Web.Config文件
< connectionStrings >   
     
< add name = " zy00 "  connectionString = " Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/zhiyuan_Data.MDF;Integrated Security=True;User Instance=True "
         providerName
= " System.Data.SqlClient "   />     
     
< add name = " zy01 "  connectionString = " Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/zhiyuan_Data.MDF;Integrated Security=True;User Instance=True "
         providerName
= " System.Data.SqlClient "   />
     
< add name = " zy02 "  connectionString = " Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/zhiyuan_Data.MDF;Integrated Security=True;User Instance=True "
         providerName
= " System.Data.SqlClient "   />
     
< add name = " zy03 "  connectionString = " Data Source=./SQLEXPRESS;AttachDbFilename=|DataDirectory|/zhiyuan_Data.MDF;Integrated Security=True;User Instance=True "
         providerName
= " System.Data.SqlClient "   />
     
<!--
          以下代码省略:说明zy00代表志愿00库,其实该库并能不使用。只是为了增强程序强壮性,如果不能正确定位其他库才转向此库操作。
    剩余的其他库依次编号更在后边即可,可以有任意多个。
    
-->
 
</ connectionStrings >
2、一段根据传入关键字进行转向的代码。(传入的关键字中包含2位地域代码,使用该代码进行转向控制)01代表石家庄、02代表。。。
 1      /// <summary>
 2    /// 根据传入的考生号来决定使用哪个数据库进行操作
 3    /// 目前定向到市级,将来可以扩充
 4    /// </summary>
 5    /// <param name="ksh"/"bmddm"></param>
 6    /// <returns>连接字符串</returns>

 7      public   static   string  changeconbyksh( string  ksh)
 8     
 9        ///ksh的第5、6位为地市代码,需要根据相应的地市代码进行判断,取用相应的字符串
10        ///

11        //为了复用该程序,在这里传入的参数可以是ksh 或bmddm需要判断,总位数以及区域代码位置不同
12        string strdishi="00";
13        if (ksh.Trim().Length == 6)
14        {
15            strdishi = ksh.Trim().Substring(02);
16        }

17        else
18        {
19            strdishi = ksh.Substring(42);
20        }

21        //数据库前缀,本例中仅对志愿库操作。
22        string prefixes = "zy";
23        //将要返回的连接
24        string strcon="";
25        switch(strdishi)
26        {
27            case "01":
28                strcon =  ConfigurationManager.ConnectionStrings[prefixes+strdishi].ToString();
29                break;
30            case "02":
31                strcon = ConfigurationManager.ConnectionStrings[prefixes + strdishi].ToString();
32                break;
33            case "03":
34                strcon = ConfigurationManager.ConnectionStrings[prefixes + strdishi].ToString();
35                break;
36                //以下省略。。。           
37            default:     //如果不能正确定位则返回一个预先定义好的垃圾回收库,1、避免返回异常。2、收集数据判断错误原因。       
38                strcon = ConfigurationManager.ConnectionStrings[prefixes + "00"].ToString();
39                break;
40        }
  
41        return strcon;
42    }
3、在程序中调用该转向语句
     // 本示例中是使用数据集中的数据适配器的例子,其他的也一样
    zhiyuansTableAdapters.tzhiyuanyxTableAdapter zyapt  =   new  zhiyuansTableAdapters.tzhiyuanyxTableAdapter();       
    
// 建好以后的adapt需要根据考生号自动定向连接
    zyapt.Connection.ConnectionString  =  zhiyuan.changeconbyksh(ksh);
    zhiyuans.tzhiyuanyxDataTable tablezhiyuan 
=   new  zhiyuans.tzhiyuanyxDataTable();        
    zyapt.getkszhiyuan(tablezhiyuan, ksh, pcdm, zyh);
ok,这样就可以使用了
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值