Thanks. I was already looking at ways to rewrite this query - the link will be
helpful.

I would have expected the query to be slow, but it looked to me like the
database stopped processing the query at all after a while. Now that I
understand just how slow it might be even under the best of circumstances
though, I think rewriting it is the way to go.

Thanks again,

Bill


Quoting [EMAIL PROTECTED]:

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






--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to