我正在保存两个用户之间的交互表。我有两种交互类型,每种交互都可以发生不止一次。最简单的参考是Facebook的赞和帖子上的评论:User1做了两个赞,一个评论了User2。
我还想要基本的查询能力,就像所有与User1交互的用户一样,用户User1也按交互次数排序。
我目前正在MySQL中保存这个文件,而且一切都进行得很顺利,但是随着表变得越来越大(7.5B行,1TB的总磁盘空间在数据和索引之间平分),插入变得非常缓慢。可占用1k行最多一分钟。
我现在的表格结构:
CREATE TABLE `interactions` (
`user_id_to` bigint(11) unsigned NOT NULL,
`user_id_from` bigint(11) unsigned NOT NULL,
`type2counter` tinyint(11) unsigned NOT NULL DEFAULT '0',
`counter` smallint(11) unsigned NOT NULL,
`updated` date NOT NULL,
PRIMARY KEY (`user_id_to`,`user_id_from`),
KEY `uid_from` (`user_id_from`),
KEY `uid_to_counter` (`user_id_to`,`counter`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;编辑:插入如下所示:
INSERT INTO interactions
(user_id_to, user_id_from, counter, updated)
VALUES
('2266931634','3180832729','3',NOW() ),
('2266931634','3133897242','1',NOW() ),
('2266931634','3207247957','1',NOW() ),
('2266931634','3520390476','1',NOW() ),
('2266931634','3631954079','1',NOW() ),
('2266931634','3687475949','1',NOW() ),
('2266931634','3627629761','1',NOW() ),
('2266931634','3779990751','1',NOW() ),
('2266931634','4071753134','1',NOW() ),
('2266931634','4290900946','3',NOW() )
ON DUPLICATE KEY UPDATE
counter=counter+VALUES(counter),
updated=NOW()MySQL版本: 5.6.19
发布于 2017-04-23 19:05:38
这有什么问题!没有列counter??
但是,假设你指的是现有的一个柜台.
counter,并经常更新计数器一次更新表,一次更新索引。PRIMARY KEY的第一部分是user_id_to,所以您有一种很好的方法来定位给定user_id_to的counter。所以,DROP这个指数。这将大大加快速度。其他要检查的东西..。innodb_buffer_pool_size应占内存的70%左右。这些东西的价值是什么?
PARTITIONing不太可能帮上忙。给定一个好的索引,分区不会更快,因为它实际上将一个1步进程(在索引中查找)转换为一个2步进程:首先找到分区("pruning"),然后在该分区中使用索引。
如果可能,可以使用LOAD DATA或“批处理”INSERTs。
INSERTs是什么样子的?也许是INSERT ... ON DUPLICATE KEY UPDATE?对于批处理,最好创建一个tmp表,然后在tmp表上使用带有SELECT的IODKU。更多用于高速摄食。
有些东西看起来很可疑,请提供有关插入、更新和选择的详细信息。
https://dba.stackexchange.com/questions/171756
复制相似问题