对于大型auto_increment键,BIGINT vs combined(tinyint,int)?

时间:2014-09-01 13:40:32

标签: mysql sql

我正在设计一个网站,并有一个处理大量插入的表格。每个月这个表将至少获得5000万条记录。

所以目前我使用bigint unsgined数据类型作为此表的主键。

CREATE TABLE `class`.`add_contact_details`
( 
`con_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, 
`add_id_ref` BIGINT UNSIGNED NOT NULL, 
`con_name` VARCHAR(200), 
`con_email` VARCHAR(200), 
`con_phone` VARCHAR(200), 
`con_fax` VARCHAR(200), 
`con_mailbox` VARCHAR(500), 
`con_status_show_email` TINYINT(1), 
`con_status_show_phone` TINYINT(1), 
`con_status_show_fax` TINYINT(1), 
`con_status_show_mailbox` TINYINT(1), 
PRIMARY KEY (`con_id`) ) ENGINE=INNODB CHARSET=latin1 COLLATE=latin1_swedish_ci; 

因此,通过大量研究,我发现大多数人都担心使用BIGINT,因为它占用大量内存并且需要大量空间。

所以我发现了一篇描述替代品的文章。这是

“你可以使用组合(tinyint,int)键.minitint将从,并默认为1.如果int值即将溢出,你将tinyint的默认值更改为2,并重置int值为1.您可以创建每天运行的代码,或者创建另一个适用的计划,该计划会检查该条件并在需要时进行更改。“

所以它有道理吗?所以有没有人使用这个? 考虑性能我应该使用什么?

对此有没有替代的enterprice级别解决方案?

2 个答案:

答案 0 :(得分:0)

BIGINT需要8个字节的存储空间,因此5000万条记录每月400 MB,这应该不是问题。

我们在一台服务器上运行几个TB的数据库(在DB2上)。

您应该考虑通过PK查询的唯一方法是在该字段上添加索引。

最好的问候

Romeo Kienzler

答案 1 :(得分:0)

坚持BIGINT。您可以使用双键保存两到三个字节,但您确实需要付费。

  1. 对表的引用需要使用两个键而不是一个,因此所有外键关系都比较复杂。
  2. 找到单行的
  3. where子句要复杂得多。考虑以下两者之间的区别:

     where id in (1, 2, 3, 4, 5)
    

     where id_part1 = 0 and id_part2 = 1 or
           id_part1 = 0 and id_part2 = 2 or
           . . .
    
  4. 增加第一部分的步骤不是自动的,需要手动干预或触发器的开销。

  5. 这让我想起了(以糟糕的方式)20多年前流行的分段内存架构。很高兴计算机可以毫无问题地理解64位密钥。