通常我们的网站承载的数据如果上万就是很多了,初级的数据库程序员一般不会考虑百万和千万级数据库的设计问题,因为一般也达不到,项目就挎掉了。
如何处理海量数据,网上找一找其实有很多方法:优化数据,合理安排索引,多表分区,多分区表,文件系统,服务器分布系统等等,想要学会这些东西往往要等到真正遇到了这样的问题才会认真的去学习。现在,看看手中的数据库,想想有什么办法可以用的?
如何存储大规模数据?做这一个事情之前当然要好好的做一下规划,共做两个表,一个存储16位的密文,一个存储32位的密文。
字段也简单,一个密文,一个明文,用char来存放,以密文为主键:
Code
CREATE TABLE [dbo].[MD516](
[md5hash] [char](16) COLLATE Chinese_PRC_CI_AS NOT NULL,
[md5key] [char](8) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_MD516] PRIMARY KEY CLUSTERED
(
[md5hash] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[MD532](
[md5hash] [char](32) COLLATE Chinese_PRC_CI_AS NOT NULL,
[md5key] [char](8) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_MD516] PRIMARY KEY CLUSTERED
(
[md5hash] ASC
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
写一个插入数据的存储过程:
Code
CREATE PROCEDURE [dbo].[P_INSERT_MD5]
@md5key char(8),
@md516 char(16),
@md532 char(32)
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [md5].[dbo].[MD532]
([md5hash]
,[md5key])
VALUES
(@md532
,@md5key)
IF @@ERROR <>0
BEGIN
INSERT INTO [md5].[dbo].[MD5ERROR]
([md5char],[md5key])
VALUES
(@md532 ,@md5key)
END
INSERT INTO [md5].[dbo].[MD516]
([md5hash],[md5key])
VALUES
(@md516,@md5key)
IF @@ERROR <>0
BEGIN
INSERT INTO [md5].[dbo].[MD5ERROR]
([md5char],[md5key])
VALUES
(@md516,@md5key)
END
END
再写一个循环来生成并写入密文及对应值:
Code
string connstr = ConfigurationManager.ConnectionStrings["md5"].ConnectionString;
for (int i = 1; i < 1000000; i++) {
Application.DoEvents();
SqlConnection conn = new SqlConnection(connstr);
string sqlstr = string.Format("exec P_INSERT_MD5 '{0}','{1}','{2}'",
i.ToString(), CharToMD5.ToMD5(i.ToString(), false).ToLower(), CharToMD5.ToMD5(i.ToString()).ToLower());
//没有过滤特殊符号
SqlCommand cmd = new SqlCommand(sqlstr, conn);
cmd.CommandType = CommandType.Text;
try {
cmd.Connection.Open();
cmd.ExecuteNonQuery();
}
catch { }
finally {
cmd.Connection.Close();
}
this.Text = sqlstr;
CharToMD5是我自己写的一个生成MD5的函数,朋友可以自己写这个function。
经试验,数据库果然没有想像的那样好用,当数据达到1,679,062时,整个primary的文件达到了176M,其中16位密文表占64M,32位密文表占96M。
这里还有另外一个问题,当数据过百万时,sqlserver的查询效率就会变慢,特别是对于char型的数据来说要比我们通常用的int型慢很多。
由于密文是主键,又是char型,还面临着庞大的索引数据,16位密文表占了0.313 MB,32位密文表占了0.734 MB。
通常我们的网站承载的数据如果上万就是很多了,初级的数据库程序员一般不会考虑百万和千万级数据库的设计问题,因为一般也达不到,项目就挎掉了。
如何处理海量数据,网上找一找其实有很多方法:优化数据,合理安排索引,多表分区,多分区表,文件系统,服务器分布系统等等,想要学会这些东西往往要等到真正遇到了这样的问题才会认真的去学习。现在,看看手中的数据库,想想有什么办法可以用的?