关于SQL主键用int还是varchar类型的一个小测试
整理电脑文档时,看到以前做的关于int,varchar类型做主键的一个小测试,将代码又在sql里走了一遍,发现竟然区别不是那么明显,可能跟我的测试数据量比较小或者电脑配置有关吧。
先建立两张表,表结构一样,只是有一个是以int类型为主键,另一个是以varchar为主键。
然后向这两个表插入50万的数据量,也许是我的电脑配置比较低,插入50万数据用了5分钟。

----------建立测试数据库及测试表----------------
--drop database test
create database Test
use Test
create table intT(
id int not null,
name varchar(50),
gid varchar(50)
)
alter table intT add primary key(id)
create table varT(
id varchar(50) not null,
name varchar(50),
gid varchar(50)
)
alter table varT add primary key(id)
----------分别对两个表插入W条数据------
declare @start datetime,@end datetime
select @start=getdate()
declare @i int
select @i=0
while @i<500000
begin
insert into intT(id,name,gid)values(@i,@i,@i)
select @i=@i+1
end
select @end=getdate()
select @end-@start
declare @i int
select @i=0
while @i<500000
begin
insert into varT(id,name,gid)values(@i,@i,@i)
select @i=@i+1
end
--drop database test
create database Test
use Test
create table intT(
id int not null,
name varchar(50),
gid varchar(50)
)
alter table intT add primary key(id)
create table varT(
id varchar(50) not null,
name varchar(50),
gid varchar(50)
)
alter table varT add primary key(id)
----------分别对两个表插入W条数据------
declare @start datetime,@end datetime
select @start=getdate()
declare @i int
select @i=0
while @i<500000
begin
insert into intT(id,name,gid)values(@i,@i,@i)
select @i=@i+1
end
select @end=getdate()
select @end-@start
declare @i int
select @i=0
while @i<500000
begin
insert into varT(id,name,gid)values(@i,@i,@i)
select @i=@i+1
end
插入数据后便可以进行不同查询条件的测试了。

----------测试查询------------------------------
-----以主键作为查询条件-----
declare @d1 datetime,@d2 datetime
select @d1=getdate()
select * from intT where id=499900
select @d2=getdate()
select @d2-@d1
declare @d3 datetime,@d4 datetime
select @d3=getdate()
select * from varT where id='499900'
select @d4=getdate()
select @d4-@d3
-----以主键作为查询条件-----
declare @d1 datetime,@d2 datetime
select @d1=getdate()
select * from intT where id=499900
select @d2=getdate()
select @d2-@d1
declare @d3 datetime,@d4 datetime
select @d3=getdate()
select * from varT where id='499900'
select @d4=getdate()
select @d4-@d3

------不以主键作为查询条件------
declare @d1 datetime,@d2 datetime
select @d1=getdate()
select * from intT where id=499900
select @d2=getdate()
select @d2-@d1
declare @d3 datetime,@d4 datetime
select @d3=getdate()
select * from varT where id='499900'
select @d4=getdate()
select @d4-@d3
declare @d1 datetime,@d2 datetime
select @d1=getdate()
select * from intT where id=499900
select @d2=getdate()
select @d2-@d1
declare @d3 datetime,@d4 datetime
select @d3=getdate()
select * from varT where id='499900'
select @d4=getdate()
select @d4-@d3
测试结果:50万的数据量下,int,varchar作为主键时,若以主键为查询条件,消耗时间几乎一样,但若以其他字段作为查询条件,两种主键的查询结果不太稳定,有时候是int快,有时候是varchar快。
总觉得测试的不够准确,数据量和语句上还需要修改,欢迎交流,赐教。
【推荐】国内首个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——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述