MySQL创建索引导致锁及表锁阻塞查询

一:场景

-- 原有表结构'
CREATE TABLE `leyangjun_user_test` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `uid` int(11) NOT NULL DEFAULT '0' COMMENT 'uid',
  `supplier_id` int(11) NOT NULL DEFAULT '0' COMMENT '服务商ID',
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `updated_at` timestamp NOT NULL DEFAULT '1971-01-01 00:00:00' COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid_supplier_id` (`supplier_id`,`uid`,`type`),
  KEY `ind_created_at` (`created_at`)
) ENGINE=InnoDB AUTO_INCREMENT=2570659 DEFAULT CHARSET=utf8mb4 COMMENT='乐杨俊用户测试'

-- 新增字段和修改所以
alter table leyangjun_user_test add `type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '用户类型:1借钱,2拿钱' after supplier_id;
ALTER TABLE `leyangjun_user_test` DROP INDEX `uid_supplier_id`; -- 删除索引
ALTER TABLE `leyangjun_user_test` ADD UNIQUE `uid_supplier_id` (`uid`,`supplier_id`,`type`); -- 重建索引

-- 历史原因(created_at没加索引导致慢查询)
ALTER TABLE `leyangjun_user_test` ADD INDEX ind_created_at ( `created_at` ) ;

   查询SQL:select * from leyangjun_user_test where uid = 123456 order by created_at desc limit 100;

 

二:导致问题(MySQL 锁)

MySQL创建索引导致锁及表锁阻塞查询_第1张图片

 

三:原有分析

MySQL在对DDL操作:

    1:mysql 5.6支持在线ddl操作,在对表进行alter table 时,对该表的增,删,改,查均不会锁表。(我线上用的是:MySQL 5.6.26)

    2:但如果在该表被访问时,执行DDL操作会导致表锁,会阻塞对表的任何操作(所以在进行上线操作时一定要观察一下是否有对表操作的慢的查询语句或者事务)

    3:如果有慢查询 -> 只有慢查询结束了之后,才能创建索引和其他的操作

 

注意:DDL操作尽量在业务低峰时候操作,以免影响正常业务

你可能感兴趣的:(MySQL)