大表,某列无索引,先需要查询该列,删除符合条件的记录,大约占40%数据量,请问有何更好的方案吗?

大表,某列无索引,先需要查询该列,删除符合条件的记录,大约占40%数据量,请问有何更好的方案吗?


一、存在其他索引(主键、唯一索引、普通索引)的情况
    1、可利用现有索引分段扫描全表,例如每次只读取1000条记录,然后再根据条件进行判断并删除数据(最好是进行归档,而不是真正删除)。
    2、由于要删除掉的数据量比较大,会造成InnoDB表较多碎片,可以考虑用反向操作,也就是创建新表,把要保留的数据复制过去,最后再将两个表对调。
    3、利用 pt-archiver 工具进行归档。


二、无任何索引的情况
    1、真发生这种情况的话,负责的DBA或者相关同学麻烦引咎辞职吧。这句话是开玩笑的,嘿,不过说真的也太挫了。
    2、观察条件列,如果区分度较高(不同值较多),就创建一个新索引,再根据索引删除数据。
    3、对该表创建一个自增主键列,然后参考上述方案,根据主键索引分段扫描、判断、删除(归档)。