我正在创建一个模块,其中每个用户经常将记录放入表中 10 到 300 秒。
当时间到期时,记录将被删除。情况是:会有很多用户并且记录会经常更改 - 这将如何影响该表的应用程序性能,因为记录会经常更改,我想知道 mysql 是否可以接受?就像索引来来去去一样,这个特定表的数据变化大约为 200 次/秒。也许我为这种工作选择了一个糟糕的解决方案。有什么建议 ?
谢谢!
小智 5
如果这是一个糟糕的解决方案将取决于很多事情。这些数据需要持久化吗?否则,可能只是将这些数据保存在内存中的解决方案会更好。
“很多用户”并没有真正帮助任何人。如果“很多”意味着几百,MySQL 很可能会很好。(虽然取决于您的数据库还必须处理什么。几千也很可能工作。)
毕竟,如果您将这些记录写入保留或在几秒钟到几分钟后删除它们,那么这并不重要。删除只是使两个操作合二为一。并且 MySQL 肯定可以处理非常大量的创建和删除记录。确保使用简单索引再次查找这些记录以进行删除。
但是,如果没有实际数字和有关您的数据库服务器使用的硬件的一些信息,就无法准确地回答这些问题。
最好的办法是编写一些小型应用程序,它只是模拟您认为将获得的负载量,而无需进行大量实际处理,只需将大量记录删除到服务器,删除它们,以相同的速度运行一些查询,例如程序的其余部分将生成。看看你的服务器,看看是否会以任何方式影响它。
不确定,但有一些选项可以为 MySQL 设置,允许它在内存中完全缓存一个表。无论如何,它在许多情况下都会这样做,而且很可能你不需要改变太多。但是,如果您谈论的是非常大量的用户和记录,您可以调整一些参数来优化缓存以满足您的特殊需求。
必须考虑的一件事是 MySQL 如何为其主要存储引擎(InnoDB和MyISAM)使用缓冲区。
这些存储引擎之间缓存在内存中的内容差异很大。
InnoDB 缓存数据页和索引页。它们被加载到 InnoDB 缓冲池中,其大小由innodb_buffer_pool_size确定。
MyISAM 仅缓存索引页,并将它们加载到密钥缓存(密钥缓冲区)中,其大小由key_buffer_size确定。
您必须使用information_schema.tables获取磁盘上占用的数据和索引大小,以便正确调整 InnoDB 缓冲池和 MyISAM Key Cache 的大小。
根据您拥有的数据量和允许的时间,您可以按如下方式预热缓存:
对于每个表TableT
通过这样做,您可以保证每个数据和索引页至少被读取一次。它们将位于缓存中。Percona部分地和原则上实践了这个概念。Percona 将这个概念构建到mk-slave-prefetch中。这个程序的作用是
这迫使slave拥有slave快速处理SQL所需的99.99%的数据。这也使得从属设备做好了准备,以防您手动故障转移到从属设备并将其提升为主设备,其缓存与您故障转移的主设备几乎相同。
没有什么比准备好、愿意并且能够在大量插入、更新和删除的环境中使用缓存更好的了。
试一试 !!!
随着像 memcached 这样的产品的诞生,一些产品已经不再需要对 MySQL 进行适当的调整。诚然,许多网站都受益于通过控制数据缓存行为来提高数据检索速度,开发人员很快就通过 memcached 看到了这一点。许多其他站点,只需切换存储引擎或正确配置 MySQL,就已经实现了相同的性能优势。在放弃数据库并严格将其用作存储库之前,请充分利用数据库。继续进行尽职调查,您可能会对 MySQL 为您做的事情感到惊喜。