mysql - 有利于复制 mysql 表以分派(dispatch)过载

标签 mysql database-performance database-replication

案例 1:
我有一个每秒插入 1 次的表 A。 从我的管理员那里,我需要对该表进行大量阅读和删除以执行一些统计和维护。

将传入数据插入 2 个不同的表 A 和 B 并使用表 B 进行管理是否有意义。目标是不使表 A 重载。

案例 2:
另一个完全理解逻辑的例子,我有一个专门用于填充搜索结果的表(tmpA)。每次有一个搜索,结果被插入到这个表中并帮助分页。晚上,旧的结果被删除。
实际上,我每秒对该表有 5 个请求,因此大约每秒 500 行 * 5 = 2500 行。

创建更多表(tmpA、tmpB、tmpC 等)以分派(dispatch)插入并避免过载是否有意义?

对于情况 1,如果复制有意义
在 2 个(或更多)差异中插入“手动”传入数据有什么区别 表之间使用 mysql 复制 ?

谢谢你, 杰西

最佳答案

这有点难以回答,因为这取决于您的硬件设置。 每秒插入一次并没有那么多。正确设置的服务器应该能够处理它。

对表的读取是非阻塞的。因此,收集信息以进行统计(假设您不对数据库中的统计信息进行计算)不应影响数据库的性能。

另一方面,删除是阻塞的,并且会加起来加载到具有大量插入的表上。

对于案例 1,我不明白您希望如何将负载分配到不同的表上。一般来说,存在数据库服务器负载,而不是特定的表负载(除非我们将阻塞进程定义为表负载)。

我从评论中了解到案例 1 是用户注册/注册。从维护的角度来看,将用户信息拆分到两个表上是很糟糕的,加上不可避免地需要发生的两个表的耦合只会增加开销 -load-,而不是减少它。如果数据分为两个表,删除数据(用户?)也是一个主要问题。 如果将数据分为两个表,您能解释一下如何管理您的数据吗?我可能遗漏了什么。

综上所述,我不建议在表之间拆分此数据。 我推荐的是:

  • 使用 InnoDB 作为表类型。它具有比 MyISAM 更小的锁定(哪个表锁定?)
  • 优化 MySQL 的 RAM/内存使用情况。适当的内存设置可实现非常快速的读写。
  • 优化您的索引。 EXPLAIN 语句可以显示每个查询使用了哪些

案例 2 我不完全理解用例,但将这些数据吐到几个表中可能是有意义的。根据您要将数据推送到这些临时表中的原因,可能会按用户、关键字或其他重要功能进行拆分。

根据用例,尝试通过 LIMIT BY 语句限制搜索结果(从而利用分页)。您不需要以这种方式存储分页结果,或者根本不需要存储结果。您能解释一下为什么要存储这些结果吗? 2500 行/秒很多。

复制完全是另一个话题,复杂得多,不是通过复制表来实现的,而是通过复制服务器来实现的。我帮不了你,从来没有做过,因为我从来不需要它。 (我最大的 MySQL 服务器大约有 80Gb,3.5 亿行,插入峰值为每​​秒 224 行)

您能否粘贴您当前使用的表的架构和一些示例数据?这可能会使案件更加清楚。

关于mysql - 有利于复制 mysql 表以分派(dispatch)过载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584142/

相关文章:

mysql - 在 mysqli 中转换 mysql_result

php - 如果 mysql_query 失败则执行多条语句

PostgreSQL 主服务器在复制流上挂起

mysql - 本地 Firebird 数据库复制/同步到在线数据库

php - 如何设置时间戳字段中的日期和时间格式

php - float 与日期不相符且日期错误?

sql - 检查查询的执行时间精确到微秒

sql - 提高第一个查询的性能

regex - 为什么 OrientDB 不使用索引来使用 "LIKE"运算符进行搜索?

沙发数据库为 "briefcase": replication and/or database dumps?