表结构如图
需要按keyword与attr两个字段进行一万条记录的删除,该如何做?
分析:首先一万条按每一千条发送到数据库进行批量删除;其次如何写sql?
第一种写法(不建议):
delete from synonym where concat(keyword,attr) in <foreach collection="list" index="index" item="item" open="(" separator="," close=")"> concat(#{item.keyword},#{item.attr}) </foreach>
原因:concat导致全表扫描,索引失效
第二种写法(不建议):
DELETE FROM synonym WHERE (keyword='手机' AND attr='123') OR (keyword='123' AND attr='小型气泵木工') or()……
原因:隐式类型转换导致索引失效,123->"123",
第三种写法:
delete from synonym where <foreach collection="list" index="index" item="item" separator=" or "> (keyword=#{item.keyword} and attr=#{item.attr}) </foreach>
加了引号,命中索引
第四:还有更好的写法或优化方案吗?