Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在没有索引表的情况下跟踪开/关_Php_Mysql_Database - Fatal编程技术网

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

Php 在没有索引表的情况下跟踪开/关,php,mysql,database,Php,Mysql,Database,我正在寻找跟踪大量开/关的最佳、可扩展的方法。开/关适用于数量从1到约6000万的项目。(在我的例子中,打开/关闭是一个单独的过程,即成员的书籍是否已被索引。) 必须按项目编号快速搜索开/关。它们不断变化,因此重新编制索引的成本不会很高。新项目添加到表末尾的频率较低 我认为,理想的解决方案应该是一个只包含索引的表——一个每个字段都是主键一部分的表。我想ORACLE有这个功能,但MySQL引擎没有 如果我使用MySQL,我认为我的选择是: 有两个字段的表——项和“开/关”字段。更改将通过更新进行处

我正在寻找跟踪大量开/关的最佳、可扩展的方法。开/关适用于数量从1到约6000万的项目。(在我的例子中,打开/关闭是一个单独的过程,即成员的书籍是否已被索引。)

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

我认为,理想的解决方案应该是一个只包含索引的表——一个每个字段都是主键一部分的表。我想ORACLE有这个功能,但MySQL引擎没有

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

  • 有两个字段的表——项和“开/关”字段。更改将通过更新进行处理

  • 一个单字段表--项。在表中意味着“打开”。更改通过INSERT和DELETE进行处理


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

    使用选项#1可能会有更大的灵活性,但两者都可以有效地工作。但是,如果速度是一个问题,您可能需要考虑创建一个堆在MySQL启动之前的堆栈表,并用其他进程在后台进行维护。另外,在表中使用int和enum字段类型。由于所有的数据都存储在内存中,所以速度应该非常快,而且因为表中存储的数据不多,所以6000万条记录在内存方面应该不会是一个巨大的负担。如果我不得不粗略估计:

    int(8)(用于增长,假设有一天您将超过1亿条记录)

    枚举(0,1)

    因此,让我们对每条记录进行10个字节的取整:

    10*60000000=600000000


    这大约是572MB的数据,加上索引和额外的开销,让我们粗略地说。。一张600 MB的桌子。如果您的服务器上有这样的内存可供使用,那么堆表可能是一个不错的选择。

    如果您使用InnoDB,6000万行的ID和开/关位对MySQL来说应该没有任何问题

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

    插入后,索引列本身不会更新。主键是(user\u id,topic\u id),我使用INSERT。。。在重复密钥更新时

    我经常进行测量,没有发现任何争用或性能问题,但我确实在memcached中进行了大量缓存读取,因为决定缓存何时过期非常简单。我一直在考虑按用户对这个表进行切分,以控制增长,但我甚至不会麻烦将它永远存储在MySQL中

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

    Redis将是一个很好的选择。特别是,它的and可以实现这一点(如果需要使用项目ID以外的内容(如上次更新时间)获取一系列值,则排序集可能会很好)


    如果您还没有使用过Redis,它可能值得一试——它是对依赖MySQL的应用程序的一个很好的补充,您可能会发现它的其他良好用途,从而简化您的生活。

    关于LibraryThing的讨论:MySQL只支持索引表。创建表索引_books(id int主键)引擎=innodb;嘿,约翰!正确的。我想我可以通过memcached完成阅读部分的工作。这些项目始终属于相同的用户,因此大多数情况下,将所有用户书籍的打开/关闭状态存储在单个memcached键中是可行的。但数据需要永久保存。当前更新命令正在终止服务器。我认为这是因为该字段只是大行结构中众多字段中的一个。您是说用户何时打开/关闭书本?