mysql中的性能改进和数据迁移策略

mysql中的性能改进和数据迁移策略,mysql,database-performance,query-performance,query-cache,Mysql,Database Performance,Query Performance,Query Cache,当我们不得不更改一个包含数十亿行的表中的列时,如何保证性能?大型表中的DML操作确实是一项非常繁琐的工作,需要在执行操作时进行适当的分析和良好的迁移策略。 假设在MYSQL数据库中有一个巨大的表,有6亿行,有一些模式操作,比如添加一个唯一的键,修改一个列,甚至向其中再添加一个列,这是一个非常繁琐的过程,需要花费数小时来处理,有时服务器会超时。为了克服这一点,我们必须拿出非常好的迁移计划,我在下面记下了其中一个 1假设有一个表Orig_X,其中我必须添加一个新列colNew,默认值为0 2创建了一

当我们不得不更改一个包含数十亿行的表中的列时,如何保证性能?

大型表中的DML操作确实是一项非常繁琐的工作,需要在执行操作时进行适当的分析和良好的迁移策略。 假设在MYSQL数据库中有一个巨大的表,有6亿行,有一些模式操作,比如添加一个唯一的键,修改一个列,甚至向其中再添加一个列,这是一个非常繁琐的过程,需要花费数小时来处理,有时服务器会超时。为了克服这一点,我们必须拿出非常好的迁移计划,我在下面记下了其中一个

1假设有一个表Orig_X,其中我必须添加一个新列colNew,默认值为0

2创建了一个伪表Dummy_X,它是Orig_X的副本,但新列colNew除外

3使用以下设置将数据从原点插入到伪原点

4自动提交设置为零,因此每次插入后都不会提交数据 妨碍演出的声明

5个二进制日志被设置为零,因此不会在这些日志中写入任何数据

6插入数据后,功能设置为1

 SET AUTOCOMMIT = 0;
 SET sql_log_bin = 0;

Insert into Dummy_X(col1, col2, col3, colNew)
Select col1, col2, col3, from Orig_X;
SET sql_log_bin = 1;
SET AUTOCOMMIT = 1;
7现在可以使用新插入的列创建主键,该列现在是主键的一部分

8现在可以创建所有唯一密钥。 9我们可以通过发出以下命令来检查服务器的状态

SHOW MASTER STATUS
10发布刷新日志也很有帮助,这样MySQL将清除旧日志

11为了提高运行类似类型查询(如上面的insert语句)的性能,应该启用查询缓存变量

SHOW VARIABLES LIKE 'have_query_cache';
query_cache_type = 1
上面是大表迁移策略的步骤,下面是提高数据库/查询性能的步骤。 1删除表上任何不必要的索引,特别注意在禁用更改缓冲时使用的唯一索引。如果没有理由使用唯一索引,请不要使用唯一索引,而应使用常规索引

2如果批量加载新表,则延迟创建主键之外的任何索引。如果您在加载数据后一次性创建它们,那么InnoDB就能够应用预排序和批量加载过程,这不仅更快,而且通常会产生更紧凑的索引

3更多内存实际上有助于性能优化。如果SHOW ENGINE INNODB STATUS显示缓冲池和内存下的任何读取/s,并且缓冲池和内存下的可用缓冲区数为零,则假设您已在服务器上正确调整INNODB_BUFFER_POOL_大小,则您可能会从中受益更多

4通常,每次插入后,数据库表都会被重新索引。这对数据库来说是一项繁重的工作,但当查询被包装在事务中时,表在处理完整个数据块之后才会被重新索引。节省了很多工作

5大多数MySQL服务器都启用了查询缓存。这是提高性能的最有效的方法之一,数据库引擎可以悄悄地处理这些方法。当同一查询执行多次时,结果将从缓存中提取,这相当快

6使用EXPLAIN关键字可以让您了解MySQL在执行查询时所做的工作。这可以帮助您发现查询或表结构的瓶颈和其他问题。EXPLAIN查询的结果将显示正在使用的索引、表的扫描和排序方式等

7如果应用程序包含许多联接查询,则需要确保联接所依据的列在两个表上都建立了索引。这会影响MySQL如何在内部优化联接操作

每个表中的8都有一个id列,该列是主键、自动递增和INT的一种类型。最好是无符号的,因为该值不能为负

9即使您的用户表具有唯一的用户名字段,也不要将其作为主键。作为主键的VARCHAR字段速度较慢。通过在内部引用具有id的所有用户,您的代码将具有更好的结构

10通常,当您从脚本执行查询时,它将等待该查询的执行完成,然后才能继续。您可以通过使用无缓冲查询来更改这一点。这为生成大型结果集的SQL查询节省了大量内存,您可以在检索第一行后立即开始处理结果集,因为您不必等到执行完完整的SQL查询

11对于数据库引擎,磁盘可能是最重要的瓶颈。在性能方面,使事物更小、更紧凑通常是有帮助的,以减少磁盘传输量

12 MySQL中的两个主要存储引擎是MyISAM和InnoDB。每个人都有自己的优点和缺点
适用于读量大的应用程序,但当有大量写操作时,它的扩展性不太好。即使您正在更新一行中的一个字段,整个表也会被锁定,在该查询完成之前,任何其他进程都无法从中读取。MyISAM在计算SELECT COUNT*类型的查询时非常快。InnoDB往往是一个更复杂的存储引擎,对于大多数小型应用程序来说,它可能比MyISAM慢。但它支持基于行的锁定,这样可以更好地扩展。它还支持一些更高级的功能,如事务。

pt online schema change是一个用于此类功能的工具。

这并不能回答这个问题。若要评论或要求作者澄清,请在其帖子下方留下评论。@Jatin:该工具专门用于在我们必须更改表中数十亿行的列时考虑性能。为什么你认为这不是一个答案?不需要批评。不需要澄清。