Eric, -----Original Message----- From: Eric Mayers <[EMAIL PROTECTED]> To: Heikki Tuuri <[EMAIL PROTECTED]> Date: Friday, February 15, 2002 1:10 AM Subject: RE: Does delete from .. where (condition) use an index?
>Heikki, > >I thought I'd bring this off the list to reduce list traffic (if you >think its useful please feel free to respond on the list). I only used I respond to the mailing list because I think this is useful info for other users. >the "USE INDEX" syntax in the "EXPLAIN SELECT ..." statement, not in the >delete. It gives me a syntax error if I include USE INDEX in a DELETE >statement... > >"DELETE FROM SYSLOG USE INDEX(ds_index) WHERE datestamp < 37827382;" Is >this the wrong syntax? Can I tell it to use the index? Sorry, no. There is no such syntax for DELETE FROM. ... >I'm working on getting more memory in the box so I can increase the size >of the buffer pool considerably. I've also put a limit on the delete >statement and put it in a loop checking affected rows and that seems to >have helped signifigantly A great idea, which did not come to my mind: using the LIMIT clause in DELETE FROM you can easily control the size of deletions! >Again, thanks for your help! > >Best Regards, >Eric Mayers >Software Engineer I >Captus Networks Best regards, Heikki Tuuri Innobase Oy --- InnoDB - transactions, row level locking, and foreign key support for MySQL See http://www.innodb.com, download MySQL-Max from http://www.mysql.com >> -----Original Message----- >> From: Heikki Tuuri [mailto:[EMAIL PROTECTED]] >> Sent: Thursday, February 14, 2002 1:23 PM >> To: Eric Mayers; [EMAIL PROTECTED] >> Subject: Re: Does delete from .. where (condition) use an index? >> >> >> Eric, >> >> thank you for the printouts. Looks like MySQL refused to obey >> the USE INDEX >> clause! Did you run the EXPLAIN on a very small table? >> Otherwise I do not >> understand why it reports only 4700 rows. >> >> You have a very long-running mass delete below. It has row >> locks on 13000 >> pages = 200 MB. It has delete marked (= deleted) 650 000 >> rows (= number of >> undo log entries). >> >> There are quite a lot of disk reads and writes per second: 23 >> + 28. The load >> is probably disk-bound. >> >> You have a very small buffer pool, only 1024 pages = 16 MB. I >> assume this is >> a stress test for a very small buffer pool. >> >> There are no dangling open transactions: only the mass delete >> and a single >> insert exist. >> >> In short, everything looks ok in the monitor output. >> >> I think it is worth to try 3.23.48 because the optimizer is >> tuned there. I >> tested deleting 15 000 rows from a 150 000 row table, and .48 >> chose to use >> the right index. >> >> Make sure the delete batches are small enough so that the >> optimizer picks >> the right index. EXPLAIN SELECT is the way to study optimizer choices. >> >> Note that because of the insert buffer, InnoDB can make >> inserts with less >> disk i/o than deletes. In the monitor output you see 9 000 >> 000 insert buffer >> records were merged in 700 000 merges: on the average 13 records were >> inserted at a time. Deleting these records will use more disk >> i/o because >> there is no similar optimization in deletes. >> >> Best regards, >> >> Heikki Tuuri >> Innobase Oy >> --- >> Order technical MySQL/InnoDB support at https://order.mysql.com/ >> See http://www.innodb.com for the online manual and latest >> news on InnoDB >> >> >> -----Original Message----- >> From: Eric Mayers <[EMAIL PROTECTED]> >> To: Heikki Tuuri <[EMAIL PROTECTED]>; [EMAIL PROTECTED] >> <[EMAIL PROTECTED]> >> Date: Thursday, February 14, 2002 7:28 PM >> Subject: RE: Does delete from .. where (condition) use an index? >> >> >> >Heikki, >> > >> >Here is what you asked for: >> > >> >mysql> EXPLAIN SELECT * FROM Syslog USE INDEX(ds_index) >> WHERE datestamp >> ><= 20020213185230; >> >+--------+------+---------------+------+---------+------+---- >> --+-------- >> >----+ >> >| table | type | possible_keys | key | key_len | ref | >> rows | Extra >> >| >> >+--------+------+---------------+------+---------+------+---- >> --+-------- >> >----+ >> >| Syslog | ALL | ds_index | NULL | NULL | NULL | >> 4719 | where >> >used | >> >+--------+------+---------------+------+---------+------+---- >> --+-------- >> >----+ >> >1 row in set (0.00 sec) >> > >> >And here is a single InnoDB Monitor output: >> > >> >===================================== >> >020214 9:07:25 INNODB MONITOR OUTPUT >> >===================================== >> >---------- >> >SEMAPHORES >> >---------- >> >OS WAIT ARRAY INFO: reservation count 85376, signal count 83573 >> >Mutex spin waits 107640, rounds 1033422, OS waits 33331 >> >RW-shared spins 34894, OS waits 17557; RW-excl spins 34957, OS waits >> >34400 >> >------------ >> >TRANSACTIONS >> >------------ >> >Trx id counter 0 10816708 >> >Purge done for trx's n:o < 0 475530 undo n:o < 0 0 >> >Total number of lock structs in row lock hash table 13009 >> >---TRANSACTION 0 10816707, OS thread id 876555, not started, runs or >> >sleeps >> >MySQL thread id 205, query id 12109132 localhost root >> >INSERT INTO logs.Syslog set caid='630', datestamp=NULL, >> >message='4187481481 1481418748 418748 418748 >> >---TRANSACTION 0 5633944, OS thread id 1445901 updating or deleting, >> >active, runs or sleeps, has 13010 lock struct(s), undo log entries >> >650408 >> >MySQL thread id 344, query id 6056015 localhost root updating >> >DELETE FROM logs.Syslog where (datestamp <= (20020213190141 >> + (3600))) >> >-------- >> >FILE I/O >> >-------- >> >I/O thread 0 state: waiting for i/o request >> >I/O thread 1 state: waiting for i/o request >> >I/O thread 2 state: waiting for i/o request >> >I/O thread 3 state: waiting for i/o request >> >Pending normal aio reads: 0, aio writes: 0, >> > ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0 >> >Pending flushes (fsync) log: 0; buffer pool: 1 >> >1164459 OS file reads, 1266570 OS file writes, 100823 OS fsyncs >> >23.25 reads/s, 27.88 writes/s, 2.06 fsyncs/s >> >------------- >> >INSERT BUFFER >> >------------- >> >Ibuf for space 0: size 518, free list len 272, seg size 791, >> >9152117 inserts, 8984010 merged recs, 675487 merges >> >--- >> >LOG >> >--- >> >Log sequence number 0 4190770295 >> >Log flushed up to 0 4190657162 >> >Last checkpoint at 0 4178363488 >> >1 pending log writes, 0 pending chkp writes >> >52481 log i/o's done, 0.88 log i/o's/second >> >---------------------- >> >BUFFER POOL AND MEMORY >> >---------------------- >> >Total memory allocated 33029216; in additional pool allocated 269312 >> >Free list length 121 >> >LRU list length 856 >> >Flush list length 805 >> >Buffer pool size 1024 >> >Pending reads 0 >> >Pending writes: LRU 0, flush list 0, single page 0 >> >Pages read 1256311, created 255856, written 1602244 >> >24.31 reads/s, 3.88 creates/s, 36.00 writes/s >> >Buffer pool hit rate 994 / 1000 >> >-------------- >> >ROW OPERATIONS >> >-------------- >> >1 queries inside InnoDB; main thread: flushing log >> >Number of rows inserted 10806106, updated 0, deleted 806508, read >> >6850315 >> >181.44 inserts/s, 0.00 updates/s, 11.69 deletes/s, 11.69 reads/s >> >---------------------------- >> >END OF INNODB MONITOR OUTPUT >> >============================ >> > >> > >> >Eric >> > >> > >> >> -----Original Message----- >> >> From: Heikki Tuuri [mailto:[EMAIL PROTECTED]] >> >> Sent: Wednesday, February 13, 2002 5:59 PM >> >> To: Eric Mayers; [EMAIL PROTECTED] >> >> Subject: Re: Does delete from .. where (condition) use an index? >> >> >> >> >> >> Eric, >> >> >> >> print what >> >> >> >> EXPLAIN SELECT * FROM Syslog USE INDEX(ds_index) WHERE ... >> >> >> >> says. >> >> >> >> Please also show what the InnoDB monitor prints. >> >> >> >> Regards, >> >> >> >> Heikki >> >> >> >> >> >> -----Original Message----- >> >> From: Eric Mayers <[EMAIL PROTECTED]> >> >> To: Heikki Tuuri <[EMAIL PROTECTED]>; [EMAIL PROTECTED] >> >> <[EMAIL PROTECTED]> >> >> Date: Thursday, February 14, 2002 3:44 AM >> >> Subject: RE: Does delete from .. where (condition) use an index? >> >> >> >> >> >> >Heikki, >> >> > >> >> >mysql> EXPLAIN SELECT * FROM Syslog WHERE datestamp <= >> 2002021310712; >> >> >+--------+------+---------------+------+---------+------+---- >> >> -----+----- >> >> >-------+ >> >> >| table | type | possible_keys | key | key_len | ref | >> rows | >> >> >Extra | >> >> >+--------+------+---------------+------+---------+------+---- >> >> -----+----- >> >> >-------+ >> >> >| Syslog | ALL | ds_index | NULL | NULL | NULL | >> 2204932 | >> >> >where used | >> >> >+--------+------+---------------+------+---------+------+---- >> >> -----+----- >> >> >-------+ >> >> >1 row in set (0.00 sec) >> >> > >> >> >How can I force it to use the index? >> >> > >> >> >(the indexes look like: >> >> > >> >> >mysql> show index from Syslog; >> >> >+--------+------------+----------+--------------+------------ >> >> -+--------- >> >> >--+-------------+----------+--------+---------+ >> >> >| Table | Non_unique | Key_name | Seq_in_index | Column_name | >> >> >Collation | Cardinality | Sub_part | Packed | Comment | >> >> >+--------+------------+----------+--------------+------------ >> >> -+--------- >> >> >--+-------------+----------+--------+---------+ >> >> >| Syslog | 1 | ds_index | 1 | datestamp | A >> >> >| 5893 | NULL | NULL | | >> >> >| Syslog | 1 | ca_index | 1 | caid | A >> >> >| 9730 | NULL | NULL | | >> >> >+--------+------------+----------+--------------+------------ >> >> -+--------- >> >> >--+-------------+----------+--------+---------+ >> >> >2 rows in set (6.90 sec) >> >> > >> >> >) >> >> > >> >> >Thanks, >> >> >Eric >> >> > >> >> > >> >> >> -----Original Message----- >> >> >> From: Heikki Tuuri [mailto:[EMAIL PROTECTED]] >> >> >> Sent: Wednesday, February 13, 2002 5:34 PM >> >> >> To: [EMAIL PROTECTED] >> >> >> Subject: Re: Does delete from .. where (condition) use an index? >> >> >> >> >> >> >> >> >> Eric, >> >> >> >> >> >> MySQL is very pessimistic about key accesses: it assumes many >> >> >> of them cause >> >> >> a random disk read. >> >> >> >> >> >> Please print >> >> >> >> >> >> EXPLAIN SELECT * FROM Syslog WHERE datestamp < ... >> >> >> >> >> >> to see how it accesses the table. >> >> >> >> >> >> I have tuned the optimization in 3.23.48 so that it would >> >> favor index >> >> >> searches more often. Please try also with 3.23.48. >> >> >> >> >> >> Regards, >> >> >> >> >> >> Heikki >> >> >> Innobase Oy >> >> >> >> >> >> "Eric Mayers" wrote in message ... >> >> >> >I haven't been able to find details about how/if MySQL (InnoDB) >> >> >> >optimizes deletes. Does it use indexes? Can I force >> it to use an >> >> >> >index? >> >> >> > >> >> >> >My table is defined as: >> >> >> > >> >> >> >CREATE TABLE Syslog( >> >> >> > id int(11) not null, >> >> >> > datestamp timestamp(14), >> >> >> > message char(255), >> >> >> > KEY ds_index(datestamp), >> >> >> > KEY id_index(id) >> >> >> >) type=InnoDB; >> >> >> > >> >> >> > >> >> >> >There are about 15 mil rows, and I'm just trying to >> delete a small >> >> >> >portion of them (0.05% perhaps). My delete looks like: >> >> >> > >> >> >> >DELETE FROM Syslog WHERE datestamp <= 2002021310712; >> >> >> > >> >> >> >(the magic number there comes from "SELECT (min(datestamp) + >> >> >> 30) AS min >> >> >> >FROM Syslog" in a previous query). >> >> >> > >> >> >> >.. and its taking a very long time.. watching the innodb >> >> monitor I'm >> >> >> >seeing a large number of reads/s (29000) and a small number >> >> >> of deletes/s >> >> >> >(10) which makes me believe its not using the index.. >> >> >> > >> >> >> >Any way to improve this? >> >> >> > >> >> >> >Eric Mayers >> >> >> >Software Engineer I >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> --------------------------------------------------------------------- >> >> >> Before posting, please check: >> >> >> http://www.mysql.com/manual.php (the manual) >> >> >> http://lists.mysql.com/ (the list archive) >> >> >> >> >> >> To request this thread, e-mail >> <[EMAIL PROTECTED]> >> >> >> To unsubscribe, e-mail >> >> >> <[EMAIL PROTECTED]> >> >> >> Trouble unsubscribing? Try: >> >http://lists.mysql.com/php/unsubscribe.php >> >>> >> >>> >> > >> >> >> --------------------------------------------------------------------- Before posting, please check: http://www.mysql.com/manual.php (the manual) http://lists.mysql.com/ (the list archive) To request this thread, e-mail <[EMAIL PROTECTED]> To unsubscribe, e-mail <[EMAIL PROTECTED]> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php