mysql就像按钮表id auto_increment optimization

时间:2015-03-14 10:16:28

标签: mysql auto-increment partitioning

我有这张桌子:

CREATE TABLE IF NOT EXISTS `likes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(40) NOT NULL,
  `post_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

它适用于大型商店,它允许客户喜欢产品。它记录谁喜欢(用户)和什么(帖子ID)。喜欢facebook。

例如: 1 - 玛丽亚 - 233 2 - 约翰 - 527 ...

所以,1喜欢,1记录。

我该如何优化它?允许多条记录?并尽可能快?

我可以使用KEY Partitioning吗?任何一个例子? id int(11)怎么样它太小了?

非常感谢你!

1 个答案:

答案 0 :(得分:0)

INT,默认为SIGNED;范围是-2亿到+20亿。它占用4个字节。但是AUTO_INCREMENTs永远不会是负数,因此INT UNSIGNED会更好 - 范围0到+ 40亿(仍然是4个字节)。

40亿人口占世界人口的一半以上。如果你来到任何接近这个数字的地方,有人会作弊,你应该插上那个洞。

同样适用于post_id。和user_id。 (哎呀,我超越了自己。)

user VARCHAR(40)CHARACTER SET latin1 - 如果你希望远程接近40亿,你需要让中国人,泰国人,韩国人等进入。使用utf8mb4。

您是否要求用户注册? (否则你怎么能阻止某人填充投票箱"?)你有另一张名为Users的桌子?它有一个AUTO_INCREMENT?那个id是一个4字节的INT UNSIGNED?所以,不要在这里使用全名;使用那个id。较小 - >更多可缓存 - >少I / O - >更快。

PARTITION?不,不要先了解PARTITION,而不要先了解它可以做什么,做多少也不能做。 本身提供速度;当然不适用于这个用例。

ENGINE = MyISAM的。您是否曾在具有十亿行MyISAM表的服务器上发生电源故障?当服务器备份时,它开始抱怨一个损坏的表。你花了几个小时搞清楚它意味着什么。然后启动REPAIR TABLE。几小时后完成。同时系统不可用。使用ENGINE = InnoDB。