在mysql中使用read replication

use*_*796 5 mysql replication scaling database-replication

我有一个mysql数据库,每天有大约1.5亿个插入,保留期约为60天.

  1. 每条记录都以id为索引.
  2. 每次更新发生如下:
    1. 看看是否有记录.如果是,请使用新数据更新相同内容.
    2. 或者创建数据.
  3. 删除60天前创建的记录.

我的主要用例如下:

运行一些批量查询.例如.:

Select (*) from table where prop=val1 and prop2=val2 etc
Run Code Online (Sandbox Code Playgroud)

将返回大量的记录,例如.1M

以下方法是好的:

  1. 拥有一个只有id的索引的主DB.保留60天.
  2. 有Read Replica DB.此DB将在许多列上编制索引
  3. 所有批量查询都将针对只读副本数据库运行.

这是一个好的解决方案吗?

编辑:我打算使用Amazon RDS DB并在他们的文档中找到它:

 Q: Can my Read Replicas only accept database read operations?
Run Code Online (Sandbox Code Playgroud)

只读副本旨在提供读取流量.但是,可能存在高级用户希望针对只读副本完成数据定义语言(DDL)SQL语句的用例.示例可能包括将数据库索引添加到用于业务报告的只读副本,而不将相同的索引添加到相应的源数据库实例.如果要为给定的只读副本启用读取以外的操作,则需要修改只读副本的活动数据库参数组,将"read_only"参数设置为"0".

Lit*_*mus 5

回答你的问题:

以下方法好不好:

  1. 有一个仅在 id 上有索引的主数据库。保留 60 天。
  2. 有只读副本数据库。该数据库将在许多列上建立索引
  3. 所有批量查询都将针对只读副本数据库运行。

这是一个很好的解决方案吗?

更新

在我看来和经验,没有。

从技术上讲,此解决方案可能有效,但实际上不适合生产使用。内置master-slave replicationmysql,只有从库的表和主库的表布局相同时才起作用。

您将拥有大约 90 亿条记录 (150 x 60)。我的估计是在磁盘上这可能需要多达 1TB(每个记录一条推文的大小)。1.5 亿次插入和 1.5 亿次删除(过期记录)肯定会使索引碎片化和inserts变慢,需要经常重新构建。

当您需要多个只读副本时,事情会变得越来越复杂,这是生态系统的自然演变。

如果你每天有 1.5 亿次插入,你应该考虑一个NOSQL数据库。Mongodb过去也支持Innodb,不知道现在是否还支持。

如果您希望坚持MySQL使用类似的 RDBMS ,您应该使用诸如Database Sharding 之类的策略。在此策略中,您以将负载分布在 MySQL 实例集群中的方式对数据进行分段。

比 Sharding 可扩展性稍差的是使用存储引擎,例如MyISAM。MyISAM 不完全符合 ACID,但提供了出色的性能。它支持并发插入。


小智 0

聚集索引

无论您使用复制数据库但您的设计数据库不是面向更大的表,您的性能都不会发生任何变化。

我建议您在阅读以下链接后检查您的设计:

InnoDb 索引类型

在这里您可以找到一些有关仅针对 innodb 表的聚集索引的示例。

6000万条条目,精选某月的条目。如何优化数据库?

它适用于 60 到 5 亿行。

搜索引擎

在其他替代方案中,您可以使用像 Sphinx 这样的开源搜索引擎,但您的数据库设计应该处于非规范化模式,其中多列转换为一列,例如:

Select (*) from table where prop=val1 and prop2=val2 and prop3=val3 ..
Run Code Online (Sandbox Code Playgroud)

创建一个唯一的列索引,如下所示: val_tot = concat(val1, val2, val3,..)

Select (*) from table where prop_key = val_tot;
Run Code Online (Sandbox Code Playgroud)