繁体   English   中英

MySQL对具有多行的表进行速度优化:处理它的最佳方法是什么?

[英]MySQL speed optimization on a table with many rows : what is the best way to handle it?

我正在开发聊天应用程序。 我想将所有内容都记录在一个表中(即“谁说什么,什么时候说”)。 我希望不久的将来我会成千上万行。 我想知道:优化表的最佳方法是什么,知道我会经常插入行,有时还会读组(即显示用户的整个对话(看看他/她登录/开始聊天然后看)当他/她退出时,显示整个对话))。

该表应该能够处理(我希望是!)许多行。 (15000 /天=>每月455万=>年末行54M)。

超过15天的对话可能会被记录下来(但我不知道该怎么做才能正确处理)。

任何想法 ?

我有两个建议给您:

  1. 如果您期望大量写入而几乎没有低优先级读取。 然后,最好使用尽可能少的索引。 索引会使插入速度变慢。 只添加您真正需要的内容。
  2. 如果日志表将变得越来越大,则应考虑日志轮换。 否则,您可能最终会得到一张巨大的损坏表。

Mysql可以很好地处理非常大的数据集,而仅需标准数据库调整和索引即可。 我运行了一个在数据库中拥有数百万行的站点,并且能够在mysql上很好地运行它。

Mysql确实具有用于处理许多行的“归档”表引擎选项 ,但是缺少索引支持将使其对您而言不是一个好选择,除了历史数据。

需要创建索引,但是您必须平衡它们,而不仅仅是可以创建它们。 它们将允许更快的查询(并且对于大表的可用查询将需要这些查询),但是索引越多,插入的成本就越高。

如果仅在“用户” id列上进行查询,则索引不会有问题,但是,如果您要对消息进行全文查询,则可能只考虑在mysql和使用sphynxlucene之类的文字进行全文搜索,因为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM