I proved that UPDATE time grows with larger number of rows in the table, while SELECT time for the same rows does not change significantly. Here is the entire test case: [root@Fedora tmp]# /usr/bin/mysqld_safe --log-slow-queries=/tmp/slow.log --log-queries-not-using-indexes & [1] 2643 [root@Fedora tmp]# Starting mysqld daemon with databases from /var/lib/mysql [root@Fedora tmp]# /usr/bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.16-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> CREATE TABLE `News` ( -> `FileID` int(8) unsigned NOT NULL auto_increment, -> `PostID` mediumint(8) unsigned NOT NULL default '0', -> `Subject` varchar(255) NOT NULL default '', -> `Category` tinyint(3) unsigned NOT NULL default '0', -> `SubCategory` smallint(5) unsigned NOT NULL default '0', -> `Date` int(10) unsigned NOT NULL default '0', -> `Parts` smallint(5) unsigned NOT NULL default '0', -> `Bytes` int(10) unsigned NOT NULL default '0', -> `fi_junk` int(10) unsigned NOT NULL default '0', -> `AuthorID` mediumint(8) unsigned NOT NULL default '0', -> `isNFO` tinyint(3) unsigned NOT NULL default '0', -> `SegFirstTime` int(10) unsigned NOT NULL default '0', -> `SegLastTime` int(10) unsigned NOT NULL default '0', -> `Segments` smallint(5) unsigned NOT NULL default '0', -> `SegmentsSeen` smallint(5) unsigned NOT NULL default '0', -> `GroupsHash` mediumint(8) unsigned NOT NULL default '0', -> PRIMARY KEY (`FileID`), -> KEY `C_D_P_j` (`Category`,`Date`,`PostID`,`fi_junk`), -> KEY `P_j_F` (`PostID`,`fi_junk`,`FileID`), -> KEY `A_j_P_D` (`AuthorID`,`fi_junk`,`PostID`,`Date`), -> KEY `C_P_D_j` (`Category`,`PostID`,`Date`,`fi_junk`), -> KEY `Date` (`Date`), -> KEY `S_D` (`SubCategory`,`Date`), -> KEY `Subject` (`Subject`(10)), -> KEY `C_D` (`Category`,`Date`), -> KEY `C_B` (`Category`,`Bytes`) -> ) ENGINE=InnoDB DEFAULT CHARSET=latin1; Query OK, 0 rows affected (0.16 sec) mysql> insert into News (PostID) values (1), (2), (3), (4); Query OK, 4 rows affected (0.00 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 4 rows affected (0.03 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0 ... executed the above several times ... mysql> insert into News (PostID) select PostID from News; Query OK, 512 rows affected (2.06 sec) Records: 512 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.00 sec) mysql> explain SELECT COUNT(*) FROM News WHERE PostID IN (1608140); +----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ | 1 | SIMPLE | News | ref | P_j_F | P_j_F | 3 | const | 1 | Using where; Using index | +----+-------------+-------+------+---------------+-------+---------+-------+------+--------------------------+ 1 row in set (0.04 sec) mysql> UPDATE News SET PostID = 1608665 WHERE PostID IN (1608140); Query OK, 1 row affected (0.04 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> exit Bye [root@Fedora tmp]# tail /tmp/slow.log # Time: 060114 13:08:03 # User@Host: root[root] @ localhost [] # Query_time: 1 Lock_time: 0 Rows_sent: 0 Rows_examined: 512 SET last_insert_id=257,insert_id=257; insert into News (PostID) select PostID from News; # Time: 060114 13:08:06 # User@Host: root[root] @ localhost [] # Query_time: 2 Lock_time: 0 Rows_sent: 0 Rows_examined: 1024 SET last_insert_id=513,insert_id=513; insert into News (PostID) select PostID from News; So, our last update was not logged. Note the time it took. Let's continue: [root@Fedora tmp]# /usr/bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.1.16-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> update News set PostID=1; Query OK, 769 rows affected (1.25 sec) Rows matched: 1025 Changed: 769 Warnings: 0 mysql> exit Bye [root@Fedora tmp]# tail /tmp/slow.log insert into News (PostID) select PostID from News; # Time: 060114 13:08:06 # User@Host: root[root] @ localhost [] # Query_time: 2 Lock_time: 0 Rows_sent: 0 Rows_examined: 1024 SET last_insert_id=513,insert_id=513; insert into News (PostID) select PostID from News; # Time: 060114 13:11:04 # User@Host: root[root] @ localhost [] # Query_time: 1 Lock_time: 0 Rows_sent: 0 Rows_examined: 0 update News set PostID=1; For that UPDATE index was surely not used, and it was logged. [root@Fedora tmp]# /usr/bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 4.1.16-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> insert into News (PostID) select PostID from News; Query OK, 1025 rows affected (1.29 sec) Records: 1025 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 2050 rows affected (2.07 sec) Records: 2050 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 4100 rows affected (3.06 sec) Records: 4100 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 8200 rows affected (5.68 sec) Records: 8200 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 16400 rows affected (11.02 sec) Records: 16400 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.00 sec) mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.01 sec) mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.00 sec) mysql> explain SELECT COUNT(*) FROM News WHERE PostID IN (1608140); +----+-------------+-------+------+---------------+-------+---------+-------+--- ---+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | ro ws | Extra | +----+-------------+-------+------+---------------+-------+---------+-------+--- ---+--------------------------+ | 1 | SIMPLE | News | ref | P_j_F | P_j_F | 3 | const | 3 | Using where; Using index | +----+-------------+-------+------+---------------+-------+---------+-------+--- ---+--------------------------+ 1 row in set (0.00 sec) mysql> SELECT COUNT(*) FROM News WHERE PostID IN (1608140); +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.01 sec) mysql> UPDATE News SET PostID = 1608665 WHERE PostID IN (1608140); Query OK, 3 rows affected (1.43 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> exit Bye [root@Fedora tmp]# tail /tmp/slow.log # Time: 060114 13:11:53 # User@Host: root[root] @ localhost [] # Query_time: 5 Lock_time: 0 Rows_sent: 0 Rows_examined: 16400 SET last_insert_id=8201,insert_id=8201; insert into News (PostID) select PostID from News; # Time: 060114 13:12:06 # User@Host: root[root] @ localhost [] # Query_time: 11 Lock_time: 0 Rows_sent: 0 Rows_examined: 32800 SET last_insert_id=16401,insert_id=16401; insert into News (PostID) select PostID from News; So, this update of 3 rows out of 16K+ took almost 2 seconds. Surely index is not used, but the UPDATE was not logged. Let's double the number of rows once more: [root@Fedora tmp]# /usr/bin/mysql -uroot test Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 to server version: 4.1.16-standard-log Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> update News set PostID=1; Query OK, 3 rows affected (0.75 sec) Rows matched: 32803 Changed: 3 Warnings: 0 mysql> insert into News (PostID) select PostID from News; Query OK, 32803 rows affected (18.20 sec) Records: 32803 Duplicates: 0 Warnings: 0 mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.01 sec) mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.00 sec) mysql> insert into News (PostID) values (1608140); Query OK, 1 row affected (0.01 sec) mysql> SELECT COUNT(*) FROM News WHERE PostID IN (1608140); +----------+ | COUNT(*) | +----------+ | 3 | +----------+ 1 row in set (0.00 sec) mysql> UPDATE News SET PostID = 1608665 WHERE PostID IN (1608140); Query OK, 3 rows affected (3.25 sec) Rows matched: 3 Changed: 3 Warnings: 0 mysql> exit Bye [root@Fedora tmp]# tail /tmp/slow.log insert into News (PostID) select PostID from News; # Time: 060114 13:14:16 # User@Host: root[root] @ localhost [] # Query_time: 0 Lock_time: 0 Rows_sent: 0 Rows_examined: 0 update News set PostID=1; # Time: 060114 13:14:41 # User@Host: root[root] @ localhost [] # Query_time: 18 Lock_time: 0 Rows_sent: 0 Rows_examined: 65606 SET last_insert_id=32804,insert_id=32804; insert into News (PostID) select PostID from News; So, SELECT is instant, UPDATE took about 2 times more on the data 2 times larger. I believe, it is enough evidence that index is NOT USED FOR UPDATE.