是否有理由在同一个数据库中复制表?

是否有理由在同一个数据库中复制表?

假设我们有多个 MySQL 服务器,一个主服务器和一些从服务器。一个成员表包含超过 5,000,000 人。

是否有任何理由(性能,原子性等)使用重复表(如member_1,member_2,member_3),然后在对其执行操作时随机切换?(特别是SELECT查询)?

答案1

我不知道 MySQL 的具体情况,但许多数据库引擎(例如 Oracle)可以对表进行分区。这看起来有点像您所指的。当你知道大多数时间只使用数据子集时,分区可以帮助提高性能。

话虽如此,但要非常小心。如果做得不好,分区可能会降低性能。一个好的分区可能是每年存档的记录,分区的关键可能是记录的年份。

答案2

我发现唯一一次在测试复杂 SQL 语句的结果时复制表是可以接受的。即便如此,您通常也会在测试数据库上执行此操作,而不是在生产数据库上的测试表上执行此操作。

答案3

出于性能原因,这样做确实会更快。
事实上,几年前 MERGE 表就是这样使用的。
您将拥有几个表,例如 member_1、member_2……以及一个作为 MERGE 引擎的成员表。
当您知道要查找的数据存在时,您将查询各个表:例如,如果 member_2 的成员在 6 个月或更早之前已在网站上注册,并且这就是您要执行的搜索。
或者,当您需要对整个表进行搜索或不需要进行表分离时,您将在 MERGE 表上进行搜索。例如,成员的姓氏是 Smith。

如果您打算使用 MERGE 来提高性能,那么您在使用时必须小心,因为虽然它有时会有所帮助,但在其他情况下可能会造成损害。

话虽如此,分区是一项较新的技术,可以为您做很多事情。
看看它是否能帮到您。

答案4

我不知道这在 MySQL 中是否可行,但表分区很有用,甚至可以提高性能。让我们考虑一个地理应用程序,其中存储了 48 个相邻较低州的人员地址。

然后你就会得到一个我们称之为基表的东西,它会被划分成 48 个其他表,每个州一个。

根据您的分区定义,此基表在执行 SELECT 时“知道”要查询哪个表,以便根据查询的状态获得所需的信息数据。它就像一个您可以查询的智能界面,查询会直接重定向到正确的基础表,而无需让用户知道这个基础表。

这里要小心,我绝对不是在谈论创建视图,而是在谈论分区数据表,这是非常不同的。

最终,以这种方式使用分区是为了获得更好的性能。

现在,我们面对的是 5 000 000 行数据表。如果索引适合查询需求,这不会对性能造成太大影响。您也许应该首先优化索引。之后,如果仍然存在一些性能问题,请考虑根据区分值对表进行分区。

Here's some details about partitioning database tables in SQL Server,这可能会给你一些关于 MySQL 的指导。并且here's an interesting article about performance partitioning in MySQL

相关内容