在没有索引表的情况下跟踪开/关

时间:2011-05-05 01:44:07

标签: php mysql database

我正在寻找最好,最可扩展的方式来跟踪大量的开/关。开/关适用于物品,数量从1到约6,000万。 (在我的情况下,开/关是成员的书是否已编入索引,是一个单独的过程。)

必须按项目编号快速搜索开/关。它们不断变化,因此重新编制索引的成本不会很高。不经常将新项添加到表的末尾。

我认为,这个想法解决方案将是一个仅有索引的表 - 一个表,其中每个字段都是主键的一部分。我收集ORACLE有这个,但没有MySQL的引擎有它。

如果我使用MySQL,我认为我的选择是:

  1. 一个双字段表 - 项目和“开/关”字段。更改将通过UPDATE处理。

  2. 单场表 - 项目。在桌子上意味着“开启”。使用INSERT和DELETE处理更改。

  3. 我对其他技术持开放态度。将整个事物按位存储在文件中?

2 个答案:

答案 0 :(得分:2)

使用选项#1可以获得更大的灵活性,但两者都可以有效地工作。但是,如果速度是一个问题,您可能需要考虑创建一个HEAP表,该表在mysql启动时预先填充并与其他进程一起保持原位。另外,在表中使用int和enum字段类型。因为它全部都存放在内存中,所以它应该是闪电般快速的,并且因为表中没有存储大量数据,所以6000万条记录不应该是内存方面的巨大负担。如果我不得不粗略估计:

int(8)(对于增长,假设某天你将超过1亿条记录)

枚举(0,1)

因此,让每个记录最多10个字节:

10 * 60,000,000 = 600,000,000

这大约是572 MB的数据,加上索引和额外的开销,所以让我们大致说一个600 MB的表。如果您的服务器上有这种内存,那么HEAP表可能就是您的选择。

答案 1 :(得分:1)

如果使用InnoDB,那么对于MySQL来说,带有ID和开/关位的6000万行应该没问题。

我有一个InnoDB表,可以跟踪用户阅读过的论坛主题以及他们阅读过的帖子。它包含2.5亿行,宽14个字节,并且不断更新...它现在每秒进行50次更新,它是午夜,所以高峰时间可能是100-200?

插入后索引列本身不会更新。主键是(user_id,topic_id),我使用INSERT ... ON DUPLICATE KEY UPDATE添加新的last_read信息。

我经常测量并且我没有看到任何争用或性能问题,但我在memcached中执行了很多缓存读取,因为决定何时使缓存过期非常简单。我一直在考虑用户对这个表进行分片以保持增长,但我甚至可能不会在MySQL中永远存储它。

  

我对其他技术持开放态度。将整个事物按位存储在文件中?

Redis将是一个很好的选择。特别是,它的setssorted sets适用于此(如果您需要使用除项目ID以外的其他内容来获取值范围,则排序集可能会很好),如上次更新时间

Redis可能值得一试,如果你还没有 - 它可以是一个依赖于MySQL的应用程序的一个很好的补充,你可能会发现它可以简化你的生活。