大型主键:10亿行MySQL + InnoDB?

问题描述:

我想知道InnoDB是否是格式化表格的最佳方式?该表包含一个字段,主键,该表每天将获得816k行(est。)。这将变得非常快速!我正在处理文件存储的方式(这会更快)?表格将存储已经处理的Twitter ID的ID号码?大型主键:10亿行MySQL + InnoDB?

此外,SELECT min('id')声明中的任何估计的内存使用情况?任何其他的想法,非常感谢!

+0

你能否提供一些关于如何访问数据的细节? – 2008-12-13 16:29:15

唯一的确定答案是尝试两个并测试,看看会发生什么。

通常,MyISAM的写入和读取速度更快,但不能同时进行。当您写入MyISAM表时,整个表会被锁定以便插入完成。 InnoDB具有更多开销,但使用行级锁定,因此读取和写入操作可以同时进行,而不会出现MyISAM的表锁定发生的问题。

但是,如果我的理解正确,你的问题有点不同。只有一列,该列是主键,这是MyISAM和InnoDB处理主键索引的不同方式的一个重要考虑因素。

在MyISAM中,主键索引就像任何其他二级索引一样。每一行的内部都有一个行ID,索引节点只是指向数据页的行ID。主键索引的处理方式与其他索引不同。

然而,在InnoDB中,主键是集群化的,这意味着它们保持连接到数据页面,并确保行内容按照主键在磁盘上保持物理排序顺序(但只在单个数据页面内可以按任何顺序分散。)

因此,我认为InnoDB可能有一个优势,那就是MyISAM本质上必须做双重工作 - 在数据页面中写入一次整数,然后再将其写入索引页面。 InnoDB不会这样做,主键索引与数据页面相同,只需写入一次即可。它只需要在一个地方管理数据,MyISAM不必管理两个副本。

对于任一存储引擎,在索引列上执行类似min()或max()的操作应该是微不足道的,或者只是检查索引中是否存在数字。由于该表只有一列,所以书签查找甚至是必要的,因为数据将完全在索引本身内表示。这应该是一个非常有效的指标。

我也不会那么担心桌子的大小。在一行的宽度只有一个整数的情况下,每个索引/数据页面可以容纳大量的行。

如果这些ID号码单调增加,而您的写入只追加数据(永远不会修改它),那么使用单个文件可能会快很多。 A SELECT min('id')然后只是读取文件的第一行,而其他任何内容都是二进制搜索。

我建议你用ID或日期开始partioning表。分区根据某些定义的逻辑将大表拆分为几个较小的表(如按日期范围拆分它),这使得它们更具管理性和内存明智。 MySQL 5.1内置此功能,或者您可以使用自定义解决方案来实现它。

在实现平面文件中的存储时,会失去数据库的所有优点 - 不能再执行涉及数据的查询。

如果你的id列有一个索引,请选择min(id)应该是O(1),这应该没有太多的内存要求。

如果你的主键在Twitter上,那么你有一个索引。

有存储引擎对MySQL的开发区域一个很好的比较:

从你的描述,我会说的MyISAM会更好,但它在很大程度上取决于应用程序的比较阅读和写作模式。

只有一个字段是主键,只添加记录,这并不适合常规数据库。

首先,您需要存储两倍的信息,每个字段都会进入数据表和索引。另一方面,关系数据库被称为一方面,因为它们将相关数据存储到一行中;很难看出你的数据是否符合要求:-)如果你还在存储其他内容,那么数据库将是值得的。

您没有提及数据是否会一次被多个进程访问 - 如果没有,那么您不需要数据库ACID原则赋予的所有优点。即使你确实需要ACID,如果没有完整的数据库,仍然可以实现。

我的第一个虽然会构建自己的B树或B +树数据文件来存储Twitter ID以避免数据重复。我可以看到你做的唯一查询(基于问题)是:

  • select tbl; min(id);和
  • select tbl where id =?

第一个可以通过简单地在B树结构之外的另一个文件中存储最低的O(1)(并且当您得到较低的一个时替换它)。我不确定这个商业案例,除非它很快找出某个Twitter ID不在表格中(所以在这种情况下,你可能也需要max)。

第二个是标准的树搜索技术,这是数据库通常在封面下使用的技术。

+0

以及我需要填补表中的空白,如果有任何,这是更容易与MySQL,因为数据将由多个脚本完成 – 2008-12-24 04:34:41

我也看到一些贸易公司使用tick数据库ie。 kdb + http://kx.com/