如何在更改大型 mysql table 时提高性能?

How can I improve performance while altering a large mysql table?

我在 table 中有 6 亿条记录,但我无法在此 table 中添加列,因为每次我尝试这样做时,它都会超时。

假设在你的 MYSQL 数据库中你有一个巨大的 table 有 6 亿行,有一些模式操作,例如添加一个唯一键,改变一列,甚至添加一列到这是一个非常繁琐的过程,需要数小时才能处理,有时还会出现服务器超时。为了克服这一点,必须想出一个非常好的迁移计划,其中一个我记在下面。

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

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

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

4) 自动提交设置为零,因此数据不会在每个插入语句后提交,影响性能。

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

6) 插入数据机器人后,特征设置为一个。

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) 我们可以通过发出以下命令来检查服务器的状态

显示大师状态

10) 发出 FLUSH LOGS 也很有帮助,因此 MySQL 将清除旧日志。

11) 为了将性能提高到 运行 类似类型的查询,例如上面的插入语句,应该启用查询缓存变量。

SHOW VARIABLES LIKE 'have_query_cache';
query_cache_type = 1

以上是大型 table 迁移策略的步骤,下面是我想提高 database/queries.

性能的步骤

1) 删除 table 上所有不必要的索引,在禁用更改缓冲时特别注意 UNIQUE 索引。如果您没有理由使用该约束,请不要使用 UNIQUE 索引,而更喜欢常规的 INDEX。

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

3) 更多内存实际上有助于性能优化。如果 SHOW ENGINE INNODB STATUS 在 BUFFER POOL AND MEMORY 下显示任何 reads/s 并且空闲缓冲区的数量(也在 BUFFER POOL AND MEMORY 下)为零,您可以从更多中受益(假设您已正确调整 innodb_buffer_pool_size在你的服务器上。

4) 通常,您的数据库 table 在每次插入后都会重新编制索引。这对您的数据库来说是一些繁重的工作,但是当您的查询包含在事务中时,table 在处理完整个批量之前不会重新编制索引。节省大量工作。

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

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

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

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

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

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

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

12) MySQL 中的两个主要存储引擎是 MyISAM 和 InnoDB。每个都有自己的优点,cons.MyISAM 适用于读取密集型应用程序,但当有大量写入时它的扩展性不是很好。即使您正在更新一行的一个字段,整个 table 也会被锁定,并且在该查询完成之前,其他进程甚至无法读取它。 MyISAM 计算速度非常快

SELECT COUNT(*)

types of queries.InnoDB 往往是更复杂的存储 引擎,并且对于大多数小型应用程序来说可能比 MyISAM 慢。但它支持基于行的锁定,扩展性更好。它还支持一些更高级的功能,例如事务。