C#操作MySQL插入代理数据时如何去除重复行问题求解
实现重复数据过滤的修改方案
第一步:优先在数据库层加兜底约束(最可靠)
给proxiestb表的ip、port字段添加联合唯一索引,从根本上禁止重复的ip+port组合写入,执行SQL如下:
ALTER TABLE proxiestb ADD UNIQUE INDEX idx_ip_port (ip, port);
添加索引后,只需要修改你的插入SQL语句为INSERT IGNORE语法即可,重复数据会被自动跳过不会抛出异常,修改后的代码如下:
for (int i = 0; i < ips.Count; i++) { MySqlCommand command = con.CreateCommand(); // 新增IGNORE关键字,重复数据直接跳过插入 command.CommandText = "INSERT IGNORE INTO proxiestb (ip,port) VALUES (@ip,@port)"; command.Parameters.AddWithValue("@ip", ips[i].InnerText); command.Parameters.AddWithValue("@port", ports[i].InnerText); Console.WriteLine(ips[i].InnerText + ":" + ports[i].InnerText); command.ExecuteNonQuery(); }
如果重复数据出现时你需要更新其他字段(比如最后更新时间、存活状态等),可以把SQL替换为ON DUPLICATE KEY UPDATE语法,示例:
INSERT INTO proxiestb (ip,port,last_check_time) VALUES (@ip,@port,NOW()) ON DUPLICATE KEY UPDATE last_check_time = NOW()
第二步:代码层前置去重(可选,提升性能)
如果爬取的数据量较大,为了减少无效的数据库请求,可以在插入前先对爬取到的结果做两次去重:
- 单次爬取结果内部去重:把本次爬取到的ip、port配对后存入HashSet,自动过滤同一次爬取任务中重复的代理
- 跨批次去重:插入前先查询数据库中已存在的ip+port组合,过滤掉已经入库的代理后再执行批量插入
额外优化建议
循环单条插入性能较低,数据量较大时可以改用批量插入语法或者MySqlBulkCopy类,减少和数据库的交互次数,提升执行效率。
内容的提问来源于stack exchange,提问作者Dylan9
相关产品推荐
相关产品推荐

