![](/img/trans.png)
[英]What is the best way to handle millions of rows inside the Visits table?
[英]MySQL speed optimization on a table with many rows : what is the best way to handle it?
我正在开发聊天应用程序。 我想将所有内容都记录在一个表中(即“谁说什么,什么时候说”)。 我希望不久的将来我会成千上万行。 我想知道:优化表的最佳方法是什么,知道我会经常插入行,有时还会读组(即显示用户的整个对话(看看他/她登录/开始聊天然后看)当他/她退出时,显示整个对话))。
该表应该能够处理(我希望是!)许多行。 (15000 /天=>每月455万=>年末行54M)。
超过15天的对话可能会被记录下来(但我不知道该怎么做才能正确处理)。
任何想法 ?
我有两个建议给您:
Mysql可以很好地处理非常大的数据集,而仅需标准数据库调整和索引即可。 我运行了一个在数据库中拥有数百万行的站点,并且能够在mysql上很好地运行它。
Mysql确实具有用于处理许多行的“归档”表引擎选项 ,但是缺少索引支持将使其对您而言不是一个好选择,除了历史数据。
需要创建索引,但是您必须平衡它们,而不仅仅是可以创建它们。 它们将允许更快的查询(并且对于大表的可用查询将需要这些查询),但是索引越多,插入的成本就越高。
如果仅在“用户” id列上进行查询,则索引不会有问题,但是,如果您要对消息进行全文查询,则可能只考虑在mysql和使用sphynx或lucene之类的文字进行全文搜索,因为mysql中的全文搜索并不是最快的,而且大大降低了插入时间。
5400万行不是很多,尤其是一年。
如果要定期输出大量数据,建议使用MyISAM和MERGE表。 由于不会删除或编辑记录,因此只要将并发设置为1,就不会有任何锁定问题。插入将始终添加到表的末尾,因此SELECT和INSERT可以同时发生。 因此,您不必使用基于InnoDB的表(可以使用MERGE表)。
您每月可能有1张表,命名为data200905,data200904等。合并表将包含您需要搜索的所有基础表。 插入是在合并表上完成的,因此您不必担心更改名称。 需要轮换数据并创建新表时,只需重新声明MERGE表即可。
您甚至可以根据季度,年份等创建多个MERGE表。一个表可以用于多个MERGE表。
我已经在每月增加3000万条记录的数据库上完成了此设置。
您可以使用两个表来处理这个问题-一个用于当前聊天记录,另一个用于存档表。 在一段时间结束(一周,一月或一天,具体取决于您的流量)后,您可以存档当前的聊天消息,将其从小表中删除并将其添加到存档中。
这样,您的应用程序将能够很好地处理最常见的情况-查询当前的聊天状态,这将非常快。
对于诸如“ x在上个月说了什么”之类的查询,您将查询存档表,这将花费更长的时间,但这是可以的,因为不会有那么多查询,而且如果有人这样做,愿意再等几秒钟。
根据您的用例,您可以扩展此原理-如果在过去6个月中对聊天消息的查询很多,请将它们也存储在单独的表中。
.NET垃圾收集器使用了相似的原理(针对完全不同的区域),该对象对于短期对象,长期对象,大型对象等具有不同的存储。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.