自己动手丰衣足食,夜谈MySQL数据库去除重复记录最快的方法

mysql数据库重复插入了一些数据,想删除保留一条,查找了很多方案,类似这种
以及这种的

初试了一下,感觉可能达到效果,但是速度太慢了,几十上百条数据还可以,几十上百万条,mysql.exe 进程基本上就跑满cpu了,半天出不来结果。大家都是程序员,就该有程序员的样子,不能完全依赖于sql语句,可以写个小工具变通下。
思路如下:
单字段重复的时候,就写个工具查询 这个字段,附带记录这个字段的主键,然后请看代码,我这边是zblog的数据库,手动插入了很多博文数据,重复了一些。

批量导入代码

var
  database: TSQLiteDatabase;
  ssql: string;
  stab: TSQLiteTable;
  I: Integer;
begin
  database := TSQLiteDatabase.Create(AnsiToUtf8(AppPath + ‘myblog.db‘));
  ssql := ‘SELECT [bid]‘ + #13#10 +
  ‘     ,[blog_user]‘ + #13#10 +
   ‘        ,[blog_server]‘ + #13#10
    + ‘     ,[title]‘ + #13#10 +
    ‘       ,[content]‘ + #13#10
    + ‘     ,[blog_url]‘ + #13#10 +
    ‘       ,[cate]‘ + #13#10 + ‘       ,[id]‘
     + #13#10 + ‘       ,[read]‘ + #13#10 + ‘       ,[pubtime]‘ + #13#10 + ‘    FROM [blog] order by blog_user,id  ;‘;
  stab := database.GetTable(ssql);
  for I := 0 to stab.RowCount - 1 do
  begin

    try

      with qry1 do
      begin

        Close;
        SQL.Clear;
        SQL.Text := ‘‘;
 // for I := 0 to 500 - 1 do

//  ShowMessage(UTF8Decode(stab.FieldByName[‘content‘]))  ;
        SQL.Text := (
‘INSERT INTO `zblog`.`zbp_post`‘ + #13#10 + ‘       (`log_AuthorID`‘ + ‘        ,`log_Tag`‘ +
‘       ,`log_Status`‘ + ‘      ,`log_Type`‘ + ‘        ,`log_Alias`‘ +
‘       ,`log_IsTop`‘ + ‘       ,`log_IsLock`‘ +
 ‘      ,`log_Title`‘ + ‘       ,`log_Intro`‘ + ‘       ,`log_Content`‘ + ‘     ,`log_PostTime`‘ +
 ‘      ,`log_CommNums`‘ + ‘        ,`log_ViewNums`‘ +
  ‘     ,`log_Template`‘ + ‘        ,`log_Meta`)‘ + ‘   VALUES‘ +
   ‘        (1‘ + ‘     ,0‘ + ‘     ,0‘ + ‘     ,0‘ + ‘     ,0‘ + ‘     ,0‘ + ‘     ,0‘
    + ‘, :title ‘ + ‘, :intro ‘ + ‘, :content ‘ +

  ‘     ,‘ + QuotedStr(IntToStr(DaysBetween(dtp1.Date,EncodeDate(1970,1,1)) * 1440 * 60 + I)) + ‘       ,0‘ + ‘     ,150‘
   + ‘      ,‘ + quotedstr(‘‘) + ‘      ,‘ + quotedstr(‘‘) + ‘)‘);

        ParamByName(‘title‘).AsString := (UTF8Decode(stab.FieldByName[‘title‘]));
        ParamByName(‘intro‘).AsString := UTF8Decode(stab.FieldByName[‘blog_url‘]);
        ParamByName(‘content‘).AsString := (UTF8Decode(stab.FieldByName[‘content‘])); 

        SQL.SaveToFile(‘a.txt‘);
        ExecSQL;
      end;
    except
      qry1.SQL.Clear;
      qry1.Close;
      stab.Next;
      Continue;
    end;
    stab.Next;
  end;

  ShowIntmessage(stab.RowCount);
  stab.Free;
  database.Free;

end;

导出重复代码

思路 按重复字段排序 找到相邻记录字段内容相同的记录,然后记录下当前的主键id
,生成删除代码,到文本文件,备用下一步

procedure TForm1.btn4Click(Sender: TObject);

var
I: Integer;
sl,ssql:TStringList;
s,cID:string;
begin

with qry1 do
begin
Close;
SQL.Clear;
SQL.Text := ‘‘;
// for I := 0 to 500 - 1 do

SQL.Text:=‘select log_ID,log_Intro,log_Title from zbp_post order by log_Intro‘;

// SQL.Add(
//‘INSERT INTO zblog.zbp_post‘ + #13#10
//+ ‘ (log_AuthorID‘ + #13#10 + ‘ ,log_Tag‘ + #13#10 + ‘ ,log_Status
//+ #13#10 + ‘ ,log_Type‘ + #13#10 + ‘ ,log_Alias‘ + #13#10 + ‘ ,log_IsTop‘ + #13#10 + ‘ ,log_IsLock
//+ #13#10 + ‘ ,log_Title‘ + #13#10 + ‘ ,log_Intro‘ + #13#10 + ‘ ,log_Content
//+ #13#10 + ‘ ,log_PostTime‘ + #13#10 + ‘ ,log_CommNums‘ + #13#10 + ‘ ,log_ViewNums‘ + #13#10 + ‘ ,log_Template‘ + #13#10 + ‘ ,log_Meta)‘ + #13#10 + ‘ VALUES‘ + #13#10 + ‘ (0‘ +
// #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,‘ + quotedstr((‘你好‘)) + #13#10 + ‘ ,‘ + quotedstr(‘intro1‘) + #13#10 + ‘ ,‘ + quotedstr(‘conn1‘) + #13#10 + ‘ ,‘ + QuotedStr(IntToStr(random(Trunc((now - encodedate(1970, 1, 1)) 1440 60)))) + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,0‘ + #13#10 + ‘ ,‘ + quotedstr(‘‘) + ‘ ,‘ + quotedstr(‘‘) + ‘);‘);
//
SQL.SaveToFile(‘a.txt‘);
// ExecSQL;
Open;
end;
cID:=‘‘;
sl:=TStringList.Create;
ssql:=TStringList.Create;
for I := 0 to qry1.RecordCount - 1 do
begin
if cID=qry1.FieldValues[‘log_Intro‘] then
ssql.Add(‘delete from zbp_post where log_ID=‘+QuotedStr(inttostr(qry1.FieldValues[‘log_ID‘]))+‘;‘);

s:=inttostr(qry1.FieldValues[‘log_ID‘])+‘,‘+qry1.FieldValues[‘log_Intro‘]+‘,‘+qry1.FieldValues[‘log_Title‘];
sl.Add(s);
cID:=qry1.FieldValues[‘log_Intro‘];
qry1.Next;
end;
ssql.SaveToFile(AppPath+‘ssql.txt‘);
sl.SaveToFile(AppPath+‘list.txt‘);
sl.Free;
ssql.Clear;

ShowintMessage(qry1.RecordCount);
end;

删除重复代码

运行上一步生成的删除命令即可,秒删

procedure TForm1.btn5Click(Sender: TObject);

var
I: Integer;
sl:TStringList;
begin
sl:=TStringList.Create;
sl.LoadFromFile(AppPath+‘ssql.txt‘);

with qry1 do
begin
Close;
SQL.Clear;
SQL.Text := ‘‘;
for I := 0 to sl.Count - 1 do

begin

SQL.Text:=sl[i];

// SQL.SaveToFile(‘a.txt‘);
ExecSQL;
end;
end;

sl.Free;
end;

delphi写的,代码很渣,效率很高
15万条数据查重,删除基本上30秒内搞定

窗体代码

object Form1: TForm1
Left = 0
Top = 0
Caption = ‘MySql‘#21435#37325#23567#31243#24207
ClientHeight = 501
ClientWidth = 464
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = ‘Tahoma‘
Font.Style = []
OldCreateOrder = False
OnShow = FormShow
PixelsPerInch = 96
TextHeight = 13
object btn1: TButton
Left = 8
Top = 8
Width = 75
Height = 25
Caption = #27979#35797#28155#21152
TabOrder = 0
OnClick = btn1Click
end
object btn2: TButton
Left = 31
Top = 256
Width = 123
Height = 81
Caption = #25171#24320#30446#24405
TabOrder = 1
OnClick = btn2Click
end
object btn3: TButton
Left = 31
Top = 110
Width = 123
Height = 81
Caption = #25209#37327#23548#20837
TabOrder = 2
OnClick = btn3Click
end
object dtp1: TDateTimePicker
Left = 24
Top = 64
Width = 186
Height = 21
Date = 43636.497093726850000000
Time = 43636.497093726850000000
ImeName = #20013#25991‘(‘#31616#20307‘) - ‘#25628#29399#25340#38899#36755#20837#27861
TabOrder = 3
end
object btn4: TButton
Left = 200
Top = 110
Width = 123
Height = 81
Caption = #23548#20986#37325#22797
TabOrder = 4
OnClick = btn4Click
end
object btn5: TButton
Left = 200
Top = 256
Width = 123
Height = 81
Caption = #21024#38500#37325#22797
TabOrder = 5
OnClick = btn5Click
end
object MySQLUniProvider1: TMySQLUniProvider
Left = 400
Top = 152
end
object con1: TUniConnection
ProviderName = ‘MySQL‘
Port = 3306
Database = ‘zblog‘
SpecificOptions.Strings = (
‘MySQL.UseUnicode=True‘)
Username = ‘‘
Server = ‘127.0.0.1‘
Connected = True
LoginPrompt = False
Left = 400
Top = 88
EncryptedPassword = ‘‘
end
object qry1: TUniQuery
Connection = con1
Left = 400
Top = 40
end
end

原文地址:https://blog.51cto.com/3242799/2412363

时间: 2024-10-10 04:23:52

自己动手丰衣足食,夜谈MySQL数据库去除重复记录最快的方法的相关文章

SQL Server 数据库查找重复记录的几种方法

http://www.hanyu123.cn/html/c61/6790.html 一.查某一列(或多列)的重复值.(只可以查出重复记录的值,不能查出整个记录的信息) 例如:查找stuid,stuname重复的记录: select stuid,stuname from stuinfo group by stuid,stuname having(count(*))>1 二.查某一列有重复值的记录.(此方法查出的是所有重复的记录,如果有两条记录重复的,就查出两条) 例如:查找stuid重复的记录:

运维角度浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

浅谈MySQL数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

(转)运维角度浅谈MySQL数据库优化

转自:http://lizhenliang.blog.51cto.com/7876557/1657465 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影

从运维角度浅谈 MySQL 数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

sql学习笔记(19)-----------浅谈 MySQL 数据库优化

一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇博文主要谈MySQL数据库发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大致分为以下五个阶段: 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分就是对表结构设计.对于数据库来说,这点很重要,如果设计不当,会直接影响访问速度和用户体验.影响的因素很多,比如慢查询.低效的查询语句.没有适当建立索引.数据库堵塞(死锁)等.当然,有测试工程师的团队

限制MySQL数据库单个用户最大连接数等的方法

服务器上总有一些网站用户的连接数过大,而影响了其他的网站的正常使用,那么如何把某一条臭鱼限制在自己的一亩三分地呢?限制MySQL数据库单个用户最大连接数等的方法下面我来说一下方法和原理: 1.对于Linux和Uinx操作系统需要找到my.cnf,对于windows操作系统需要找到my.ini 2.因为my文件是MySQL的配置文件,我们以前只知道他是对MySQL数据库的整体控制,其实他还可以对单个用户进行限制. 3.将my.cnf或my.ini下载下来,编辑,可以把多余项去掉,加入: max_c

SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 order by用在表名的后面 order by后面就填你要按它排序的字段,是升序排序(从小到大排序) percent:百分比 %=percent 比如要显示5%的数据处理,不能写top 5%,而是top 5 percent 提示:如果top 5 percent出来的数是3.1条数据的话,是取四条数据,而不

MySQL数据库远程访问权限如何打开(两种方法)

MySQL数据库远程访问权限如何打开(两种方法) 下载GPL版本安装 MySQL Community Edition(GPL) Community (GPL) Downloads 在我们使用mysql数据库时,有时我们的程序与数据库不在同一机器上,这时我们需要远程访问数据库.缺省状态下,mysql的用户没有远程访问的权限. 下面介绍两种方法,解决这一问题. 1.改表法 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "