mysql-update时where条件无索引锁全表
1 5.3日数据处理需求
UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 YEAR) where warranty_end_date = '1900-01-01';
2 处理过程
2.1查看执行计划
很明显走的是索引的全表扫描,再加上数据库的隔离级别是RR的级别,并且warranty_end_date字段无索引,会造成全表的GAP锁,为了减少更新阶段对其它dml语句造成lock的风险,该数据库版本是支持online DDL的,特在warranty_end_date字段上
创立一个索引
2.2创建索引
mysql> alter table md_meter add index idx_warranty_end_date;
执行计划可见语句执行效果明显改善
2.3 执行更新
mysql> UPDATE md_meter set warranty_end_date = DATE_ADD(warranty_begin_date,INTERVAL 10 YEAR) where warranty_end_date = '1900-01-01';
加锁处理分析 online DDL可参考文档: