关于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  

 插入数据后便可以进行不同查询条件的测试了。 

代码
-- --------测试查询------------------------------ 
--
---以主键作为查询条件----- 
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快。

总觉得测试的不够准确,数据量和语句上还需要修改,欢迎交流,赐教。

 






     本文转自wengyuli 51CTO博客,原文链接:http://blog.51cto.com/wengyuli/588046,如需转载请自行联系原作者


相关文章
|
15天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
27 10
|
17天前
|
SQL 存储 关系型数据库
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
24天前
|
Python
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
19 3
|
2月前
|
存储 关系型数据库 MySQL
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
覆盖索引、前缀索引、索引下推、SQL优化、EXISTS 和 IN 的区分、建议COUNT(*)或COUNT(1)、建议SELECT(字段)而不是SELECT(*)、LIMIT 1 对优化的影响、多使用COMMIT、主键设计、自增主键的缺点、淘宝订单号的主键设计、MySQL 8.0改造UUID为有序
MySQL高级篇——覆盖索引、前缀索引、索引下推、SQL优化、主键设计
|
7天前
|
SQL 存储 数据采集
sql中varchar转number时报错怎么解决
通过上述策略的综合运用,面对VARCHAR到NUMBER的转换挑战,不仅能够游刃有余地解决现有的问题,更能前瞻性地预防未来的隐患。在数字化转型的浪潮中,凭借其高性能、安全稳定的云产品与服务,为各类企业级应用保驾护航,助您轻松驾驭数据的海洋,实现业务的无缝扩展与全球布局。
19 0
|
3月前
|
SQL 数据处理 数据库
SQL中的函数有哪些类型
【8月更文挑战第20天】SQL中的函数有哪些类型
30 1
|
3月前
|
SQL 存储 数据库
SQL Server 中的备份类型详解
【8月更文挑战第31天】
61 0
|
3月前
|
SQL 存储 数据库
|
3月前
|
SQL 关系型数据库 数据处理
|
3月前
|
SQL 存储 数据库
SQL中的不同关系类型:深入解析
【8月更文挑战第31天】
52 0