通常我们的网站承载的数据如果上万就是很多了,初级的数据库程序员一般不会考虑百万和千万级数据库的设计问题,因为一般也达不到,项目就挎掉了。
如何处理海量数据,网上找一找其实有很多方法:优化数据,合理安排索引,多表分区,多分区表,文件系统,服务器分布系统等等,想要学会这些东西往往要等到真正遇到了这样的问题才会认真的去学习。现在,看看手中的数据库,想想有什么办法可以用的?
如何存储大规模数据?做这一个事情之前当然要好好的做一下规划,共做两个表,一个存储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。
通常我们的网站承载的数据如果上万就是很多了,初级的数据库程序员一般不会考虑百万和千万级数据库的设计问题,因为一般也达不到,项目就挎掉了。
如何处理海量数据,网上找一找其实有很多方法:优化数据,合理安排索引,多表分区,多分区表,文件系统,服务器分布系统等等,想要学会这些东西往往要等到真正遇到了这样的问题才会认真的去学习。现在,看看手中的数据库,想想有什么办法可以用的?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?