2013-03-06 173 views
9

索引字段和硬盘/ RAM上的空间标记最适合什么? Biginteger或Varchar(15)? 我能有这样的例子索引号:Mysql Bigint VS Varchar

from 10000001 to 45281229703 and higher... 

但是,什么是更好的选择呢? 也在非索引字段上,哪种字段类型更好?

+1

一个更好的问题是哪些类型*正确*代表现场..一旦接通后,使用它。如果没有*测量*性能问题(使用可以测量替代品性能的设置),则不存在性能问题 - 不要像这样“优化”。 – 2013-03-06 07:58:01

+0

@pst麻烦的是,bigint和varchar - 都代表的领域正常,所以,我如何需要 – brabertaser19 2013-03-06 08:04:14

+0

第一代表一个数字。另一个代表文本(可能是数字的文本表示)。哪个是对的? – 2013-03-06 08:07:19

回答

23

BIGINT始终是8个字节,VARCHAR(15)是依赖于值长度1..16字节,所以需要BIGINT上少量(少于7个位数)上大numnbers更少的存储器,但更多的内存。另外,BIGINT速度更快。

+0

但作为外键在其他表?例如:id文本for_id,对于id我必须做bigint,对吧?那么选择什么? )如果我有从1到45281229703和更高的行的 – brabertaser19 2013-03-06 07:51:27

+0

这里也签名/签名有很大的区别? – brabertaser19 2013-03-06 07:52:10

+0

另外请记住,Varchar需要编码转换,因此不明确,原始数字不存在此问题。 – 0xCAFEBABE 2013-03-06 07:54:54

3

VARCHAR增加了开销:

的每场,并在索引 存储(在MySQL额外2个字节IIRC)将字符串需要

长度需要在比较

+0

但作为其他表中的外键?例如:id文本for_id,对于id我必须做bigint,对吧? – brabertaser19 2013-03-06 07:50:22

+0

是的,也bigint – PSR 2013-03-06 07:50:54

+0

这里也签名/签名是很大的区别? – brabertaser19 2013-03-06 07:53:04

3

我们已经在模拟运行试验核对多个处理环境。

  1. 创建能够使用1 BIGINT和1VARCHAR参数。
  2. 插入30Lac行。
  3. 在两个字段上创建索引。
  4. 结果是:BIGINT响应差不多20time的比VARCHAR更快。

这里是脚本来执行上述步骤:

Create table r5(mob bigint,m_mob varchar(30)); 

Create index i_d on r5(mob,m_mob); 


do $$ 
begin 
for i in 1..3000000 loop 
insert into r5(mob,m_mob) values(i,i||’abc’); 
end loop; 
end; $$ 

select * from r5 
where mob=2900000; 

select * from r5 
where m_mob=’2900000abc’;