I'm really confused. First, I don't understand why quoting my IN() values here caused them to run significantly slower than the non-quoted versions... on just this simple contrived example it can be as much as 2.2 seconds vs. 0 seconds to return on a table that has 2.5M rows.
The problem I'm facing is that the stupid PEAR::DB class is "smart-quoting" a list of values and giving me this: mysql> explain select * from bite_event_log where id_file_set in ('-1','2412948') limit 1; +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ | 1 | SIMPLE | bite_event_log | ALL | id_file_set | NULL | NULL | NULL | 1213328 | Using where | +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ But what I really want is for it to do this: mysql> explain select * from bite_event_log where id_file_set in (-1,2412948) limit 1; +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+ | 1 | SIMPLE | bite_event_log | range | id_file_set | id_file_set | 5 | NULL | 2 | Using where | +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+ Mixing quoted and non-quoted is said to be "bad" http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_in mysql> explain select * from bite_event_log where id_file_set in ('-1',2412948) limit 1; +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ | 1 | SIMPLE | bite_event_log | ALL | id_file_set | NULL | NULL | NULL | 1213328 | Using where | +----+-------------+----------------+------+---------------+------+---------+------+---------+-------------+ However, aside from the straight numerical one above (2nd down), this version is the second best performing!? And furthermore, using a word string like "bogus" significantly out-performs another string such as "-1". Huh?!? WTF? It's like mySQL was "smart enough" to know that "bogus" could be dropped, whereas it's not smart enough to know to drop "-1", despite the fact that the id_file_set column is an unsigned integer. mysql> explain select * from bite_event_log where id_file_set in ('bogus',2412948) limit 1; +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+ | 1 | SIMPLE | bite_event_log | range | id_file_set | id_file_set | 5 | NULL | 2 | Using where | +----+-------------+----------------+-------+---------------+-------------+---------+------+------+-------------+