对于我正在开发的 Web 应用程序,我需要存储大量记录。每条记录将包含一个主键和一个(短)字符串值。我希望有大约 100GB 的可用存储空间,并希望能够全部使用。
记录会被频繁地插入、删除和读取,我必须使用 MySQL 数据库。数据完整性并不重要,但性能才是。我可能会遇到哪些问题和陷阱,以及哪种存储引擎最适合该任务?
非常感谢,J
对于我正在开发的 Web 应用程序,我需要存储大量记录。每条记录将包含一个主键和一个(短)字符串值。我希望有大约 100GB 的可用存储空间,并希望能够全部使用。
记录会被频繁地插入、删除和读取,我必须使用 MySQL 数据库。数据完整性并不重要,但性能才是。我可能会遇到哪些问题和陷阱,以及哪种存储引擎最适合该任务?
非常感谢,J
无论您使用哪种解决方案,因为您说您的数据库将是大量写入,您需要确保整个表不会在写入时锁定。这排除了一些人建议的 MyISAM。MyISAM 将在更新、删除或插入时锁定表。这意味着任何想要从表中读取的客户端都必须等待写入完成。不知道 INSERT LOW PRIORITY 做了什么,可能是一些围绕表锁定的 hack :-)
如果您只是必须使用 MySQL,您将需要 InnoDB,它不会锁定写入。我不知道 MySQL 是如何处理 VACUUM 的 InnoDB 表的(InnoDB 是像 PostgreSQL 一样的 MVCC,因此需要清理)......但是如果您进行大量更新或删除,则必须考虑到这一点。
这完全取决于您的应用程序正在生成的读/写模式,以及您想要获得的准确度级别。例如,如果您并不真正关心让所有最后插入的行立即可用,请考虑使用 INSERT LOW PRIORITY 可以帮助 SELECT。如果文本大小相对较小,您可以使用固定的 CHAR 类型,这将有助于索引很多并减少 SELECT 的时间如果您的应用程序生成大量更新,您会更喜欢 InnoDB 存储引擎,它允许在更新(与 myISAM 上的所有表相比)。另一方面,它更占用 CPU,所以如果您不使用事务并且您的更新模式相对较小,请考虑使用 myISAM
如果您正在使用索引(即使您没有使用),您也可能会遇到缩放问题。您可以尝试分区以尝试减少这些影响。
在我自己的项目中,完整性并不重要,但性能也很重要。我们所做的是放宽所有事务要求、放宽磁盘同步要求和提交批量插入,我们确实提高了写入速度。
此外,请确保您自己进行测试以调整内存大小。我相信 MySQL 有几种不同类型的缓存,您可以配置它们的大小。
你肯定想使用 MyISAM 作为存储引擎。但是你说你期望 100 GB,它只包含一个短字符串值。您肯定希望使用 64 位 int 作为您的身份/主键。
但我真正的问题是。您是否使用它来存储来自网站的会话信息?如果是这样,您想使用 memcache 而不是 MySQL。
大型 MySQL 查询使我的四核/8GB Ram DB 服务器崩溃...
解决方案是使用 PostgresSQL(如果你负担得起的话,SQL Server)
如果“短字符串”位于固定长度的列中,那么您的情况会好得多,这样表就有固定长度的行。那时,带有 MyISAM 的 MySQL 将为您非常有效地运行。为 Key Buffer 分配尽可能多的内存,以便内存中的大部分索引。您的目标应该是对磁盘进行一次随机访问以检索一行——在给定 100GB 数据和 8GB 内存的情况下,您不能做得比这更好。您不应该期望每秒实现超过几百个这样的查询,因为这是磁盘可以执行的所有随机访问。
您可能对我的 MySQL 自定义存储引擎(在此处描述)感兴趣。它管理内存的方式与 MyISAM 不同,尽管您的应用程序的配置文件并不完全是我的引擎优化的目标。