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

时间:2015-03-28 13:36:24

标签: mysql database-performance query-performance query-cache

当我们必须用数十亿行更改表中的列时,如何处理性能?

2 个答案:

答案 0 :(得分:0)

大表中的

DML 操作实际上是一项非常繁琐的工作,需要在执行操作时进行适当的分析和良好的迁移策略。  假设在你的 MYSQL数据库中你有一个拥有6亿行的巨型表,有一些架构操作,例如添加一个唯一键,改变一列,甚至再添加一列,这是一个非常麻烦的过程这将花费数小时来处理,有时会有服务器超时。为了克服这个问题,我必须提出一个非常好的移民计划,其中一个我在下面记录。

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

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

3)使用以下设置将数据从Orig_X插入Dummy_X。

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)发出FLUSH LOGS也很有帮助,因此MySQL将清除旧日志。

11)为了提高性能以运行类似类型的查询,例如上面的insert语句,应该有一个查询缓存变量。

SHOW VARIABLES LIKE 'have_query_cache';
query_cache_type = 1

以上是大表的迁移策略的步骤,下面我正在考虑提高数据库/查询性能的步骤。 1)删除表上任何不必要的索引,当禁用更改缓冲时,要特别注意UNIQUE索引。如果您没有理由要求使用UNIQUE索引,请选择常规INDEX。

2)如果批量加载新表,则延迟创建除PRIMARY KEY之外的任何索引。如果在加载数据之后全部创建它们,那么InnoDB就能够应用预排序和批量加载过程,这个过程既快又通常会产生更紧凑的索引。

3)更多内存实际上可以帮助进行性能优化。如果SHOW ENGINE INNODB STATUS显示BUFFER POOL和MEMORY下的任何读数,并且可用缓冲区的数量(也在BUFFER POOL AND MEMORY下)为零,则可以从更多中获益(假设您在服务器上正确调整了innodb_buffer_pool_size的大小。

4)通常,每次插入后,数据库表都会重新编入索引。这对您来说是一个繁重的数据库,但是当您的查询被包装在一个Transaction中时,在处理完整个批量之后,该表才会被重新编制索引。节省了大量的工作。

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

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

7)如果您的应用程序包含许多JOIN查询,则需要确保您加入的列在两个表上都已编入索引。这会影响MySQL内部优化连接操作的方式。

8)在每个表中都有一个id列,它是PRIMARY KEY,AUTO_INCREMENT和INT的一种风格。也最好是UNSIGNED,因为价值不能是负数。

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

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

11)对于数据库引擎,磁盘可能是最重要的瓶颈。保持更小,更紧凑通常有助于提高性能,减少磁盘传输量。

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

答案 1 :(得分:-1)

pt-online-schema-change是此类工具。