use*_*796 5 mysql replication scaling database-replication
我有一个mysql数据库,每天有大约1.5亿个插入,保留期约为60天.
我的主要用例如下:
运行一些批量查询.例如.:
Select (*) from table where prop=val1 and prop2=val2 etc
Run Code Online (Sandbox Code Playgroud)
将返回大量的记录,例如.1M
以下方法是好的:
这是一个好的解决方案吗?
编辑:我打算使用Amazon RDS DB并在他们的文档中找到它:
Q: Can my Read Replicas only accept database read operations?
Run Code Online (Sandbox Code Playgroud)
回答你的问题:
以下方法好不好:
- 有一个仅在 id 上有索引的主数据库。保留 60 天。
- 有只读副本数据库。该数据库将在许多列上建立索引
- 所有批量查询都将针对只读副本数据库运行。
这是一个很好的解决方案吗?
更新
在我看来和经验,没有。
从技术上讲,此解决方案可能有效,但实际上不适合生产使用。内置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 表的聚集索引的示例。
它适用于 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)