大表加索引方案

背景

每个公司针对数据库的设计都有套方案。最近在巡检表的设计,发现之前有张表漏掉了针对更新时间字段updated_at的索引,现在需要加上该索引。

我们都知道,为表增加索引是会对表进行加锁处理的。稍有不慎,可能会导致表被锁后,业务无法进行读写操作而产生事故影响,通常都是报错Waiting for meta data lock。在对表进行修改时,特别是生产上,我们首先要观察对应的表此时是否在高并发读写(选择操作时机)、表的量级信息

方案

整体思路是:

  1. 先创建一张表,结构和原表相同;
  2. 在新表上添加索引;
  3. rename新表为原表的表名,原表换新的名称;
  4. 为原表新增索引;
  5. 待索引创建成功后,rename原表为原来的名称,并将新表里的数据导入到原表中

SQL可参考:

-- 假设需要添加索引的表为`fea_moni_res`
-- 1. 新建与表`fea_moni_res`同结构的表
CREATE TABLE fea_moni_res_tmp LIKE fea_moni_res;

-- 2. 新表上添加索引
ALTER TABLE fea_moni_res_tmp ADD INDEX idx_index_name (col_name);

-- 3. *rename*新表为原表的表名,原表换新的名称
RENAME TABLE fea_moni_res TO fea_moni_res_1, fea_moni_res_tmp TO fea_moni_res;

-- 4. 为原表新增索引,此步耗时较长
ALTER TABLE fea_moni_res_1 ADD INDEX idx_index_name (col_name);

-- 5. 待索引创建成功后,rename原表为原来的名称,并将新表里的数据导入到原表中
RENAME TABLE fea_moni_res TO fea_moni_res_tmp, fea_moni_res_1 TO fea_moni_res;
-- 需要根据业务来确定如果导入数据
INSERT INTO fea_moni_res(col_name1, col_name2) SELECT col_name1, col_name2 FROM fea_moni_res_tmp;

总结

本文提供了一种为大表添加索引的方法。当然,此方案不是完美的。譬如,步骤3中的rename操作后,是极有可能会对业务产生影响的,因为业务需要根据历史数据来判断逻辑。此时可能不得不在步骤2之后,先行将原表中的数据导入到新表中,待完全导入后再直接切表操作。此需要根据业务的场景来判断,具体问题具体分析。

此处只是提供了一种方案,涉及到为大表添加字段、删除字段的表锁操作均可参考。

您好!对于MySQL大表加索引导致卡死的问题,可以尝试以下几个解决方案: 1. 分析查询语句:首先,分析导致卡死的查询语句,使用EXPLAIN命令来查看查询计划。检查是否存在全表扫描、临时表或排序操作等耗时操作,尽量优化查询语句,减少不必要的操作。 2. 分批处理数据:如果数据量较大,可以考虑按批次处理数据。将大表划分为多个小表,分批索引,以减少对数据库的压力。可以使用LIMIT和OFFSET来分批获取数据,并逐步索引。 3. 使用并行查询:MySQL 5.7及以上版本支持并行查询功能,可以通过设置max_execution_time参数来启用并行查询。并行查询可以将查询任务划分为多个子任务,并行执行,提高查询效率。 4. 优化硬件和配置:确保服务器硬件满足需求,例如磁盘I/O性能、内存大小等。同时,根据实际情况调整MySQL的配置参数,如innodb_buffer_pool_size、innodb_log_file_size等。 5. 数据库分区:如果业务允许,可以考虑对大表进行分区。通过将数据划分到不同的分区中,可以降低每个分区的数据量,速查询。 6. 数据库优化工具:使用MySQL性能优化工具,如pt-query-digest、MySQLTuner等,对数据库进行性能分析和优化。 请注意,在实施任何更改之前,请务必备份您的数据,并在非生产环境中进行测试。如果问题仍然存在,请考虑咨询专业的数据库管理员或MySQL技术支持。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值