Bill Duffy <[EMAIL PROTECTED]> wrote on 08/31/2005 11:32:02 AM:

> When I run a query like this
> 
> DELETE FROM test_P_Cookie WHERE ViewID IN (    SELECT ViewID  FROM
> test_x_RM_4508_48875 )
> 
> it never completes.
> 
> test_x_RM_4508_48875 contains 180139 rows. test_P_Cookie contains 
22,957,702
> rows. There does not appear to be any iowait problem and CPU is about 50 
% in
> use if top is to be believed. I am running this on RHEL3.
> 
> Table structures:
> 
> CREATE TABLE `test_x_RM_4508_48875` (
>   `ViewID` int(11) NOT NULL default '0',
>   `VisitID` int(11) NOT NULL default '0'
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
> 
> CREATE TABLE `test_P_Cookie` (
>   `ViewID` int(11) NOT NULL default '0',
>   `P_CookieID` int(11) NOT NULL default '0',
>   UNIQUE KEY `test_P_Cookie1` (`ViewID`,`P_CookieID`)
> ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
> 
> I tried tuning around this thinking it was a performance issue, but 
can't seem
> to get anywhere. innodb settings below:
> 
> | innodb_additional_mem_pool_size | 20971520                        |
> | innodb_autoextend_increment     | 8                               |
> | innodb_buffer_pool_awe_mem_mb   | 0                               |
> | innodb_buffer_pool_size         | 268435456                       |
> | innodb_data_file_path           | ibdata1:10M:autoextend          |
> | innodb_data_home_dir            | /var/lib/mysql/                 |
> | innodb_fast_shutdown            | ON                              |
> | innodb_file_io_threads          | 4                               |
> | innodb_file_per_table           | OFF                             |
> | innodb_locks_unsafe_for_binlog  | OFF                             |
> | innodb_flush_log_at_trx_commit  | 1                               |
> | innodb_flush_method             |                                 |
> | innodb_force_recovery           | 0                               |
> | innodb_lock_wait_timeout        | 50                              |
> | innodb_log_arch_dir             | /var/lib/mysql/                 |
> | innodb_log_archive              | OFF                             |
> | innodb_log_buffer_size          | 8388608                         |
> | innodb_log_file_size            | 268435456                       |
> | innodb_log_files_in_group       | 2                               |
> | innodb_log_group_home_dir       | /var/lib/mysql/                 |
> | innodb_max_dirty_pages_pct      | 90                              |
> | innodb_table_locks              | ON                              |
> | innodb_max_purge_lag            | 0                               |
> | innodb_mirrored_log_groups      | 1                               |
> | innodb_open_files               | 300                             |
> | innodb_thread_concurrency       | 8                               |
> | interactive_timeout             | 28800                           |
> 
> I tried this in MySQL 4.1.8, 4.1.12, and 4.1.14. Any help would be 
> appreciated,
> 
> Bill
> 

I think that the subquery processing is what is killing your performance. 
In the best-case scenario, the subquery will be executed once and each row 
of your 22million-row table will have to check itself against a 
180thousand-term IN () clause (without the benefit of an index). That just 
takes a lot of CPU cycles to perform.

Have you tried the multi-table delete syntax? 
http://dev.mysql.com/doc/mysql/en/delete.html
It should use an index or indexes if they available.  This is how it could 
look (there are two valid syntaxes, this is one of them):

DELETE test_P_Cookie
FROM test_P_Cookie 
INNER JOIN test_x_RM_4508_48875
        ON test_P_Cookie.ViewID = text_x_RM_4508_48875.ViewID;

Because test_P_Cookie is the only table listed in the DELETE clause, that 
is the only table that will lose records. If you had an index on 
text_x_RM_4508_48875.ViewID, this will really fly. I would guess it might 
take roughly 20 seconds, more or less, with the dataset you describe. 
Without the index, you will have to wait a bit longer. I would guess in 
the 2-5 minute range.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to