使用: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