使用:MySQL的5.6在Windows,在my.ini的如何提高MySQL的DELETE查询性能
表默认的配置文件设置:datatbl1
row_id | emailaddr | valid
--------------------------------
INT, PK | VARCHAR(255) | BIT
两个EMAILADDR和ROW_ID每个都有一个指标定义的列。
表中有600,000行,目标是删除重复项。查询是:
delete dt2 from datatbl1 dt1 JOIN datatbl1 dt2 on (dt1.emailaddr = dt2.emailaddr) and (dt1.row_id < dt2.row_id);
在我的系统,它需要大约15分钟才能完成此查询,我看mysqld进程在任务管理器,处理器使用的是整个时间的100%,但内存使用不穿过约140MB,即使安装了大约3GB的内存(RAM)和大量的可用内存。
问题:
- 我可以更改一些配置参数,以提高性能?
- 查询本身是否可以重写以提高性能?
- 用一两百万行来执行这个查询需要多长时间?
请记住,这个查询后需要被应用到其它表,即删除datatbl1比赛为匹配其他表(datatbl2,datatbl3,datatbl4等),它们具有相同的表结构的记录。
在我的客户端系统上,相同的查询需要2个小时。不同的是,他有一个正常的硬盘驱动器,而我有一个SSD。
该应用程序是一个带Delphi前端的客户端服务器应用程序,旨在供普通用户在Windows PC上使用,因此MySQL几乎总是在最终用户的Windows PC上运行。
在此先感谢。
编辑:根据要求 解释输出是:
mysql> explain delete dt2 from datatbl1 dt1 JOIN datatbl1 dt2 on (dt1.emailaddr
= dt2.emailaddr) and (dt1.row_id < dt2.row_id);
+----+-------------+-------+-------+------------------------------+-------------
+---------+--------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key
| key_len | ref | rows | Extra |
+----+-------------+-------+-------+------------------------------+-------------
+---------+--------------------------+------+-------------+
| 1 | SIMPLE | dt1 | index | PRIMARY,ixemailaddr,ixrow_id | ixemailaddr
| 257 | NULL | 1 | Using index |
| 1 | SIMPLE | dt2 | ref | PRIMARY,ixemailaddr,ixrow_id | ixemailaddr
| 257 | emailmgrdb.dt1.emailaddr | 1 | Using where |
+----+-------------+-------+-------+------------------------------+-------------
+---------+--------------------------+------+-------------+
2 rows in set (0.01 sec)
由于您没有使用'UNIQUE'关键字,这是一次性事件吗? – 2013-04-06 07:26:50
你可以发布你的查询的'EXPLAIN'结果吗? – piotrekkr 2013-04-06 07:29:20
@piotrekkr:发布解释结果。 – 2013-04-06 07:41:29