A quick test on a table integers
with only the field i
(and 2621441 rows):
SELECT i
FROM integers
WHERE (
i in (SELECT i FROM integers WHERE i = 100)
OR
i in (SELECT i FROM integers WHERE i = 200)
OR
i in (SELECT i FROM integers WHERE i = 1000)
)
ORDER BY i;
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| 1 | PRIMARY | integers | NULL | index | NULL | PRIMARY | 4 | NULL | 2615753 | 100.00 | Using where; Using index |
| 4 | SUBQUERY | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 3 | SUBQUERY | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 2 | SUBQUERY | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
+----+-------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
4 rows in set, 1 warning (0.01 sec)
Above returns result in about 2 secs.
SELECT i
FROM integers
WHERE i in (
SELECT i FROM integers WHERE i = 100
UNION ALL
SELECT i FROM integers WHERE i = 200
UNION ALL
SELECT i FROM integers WHERE i = 1000
)
ORDER BY i;
+----+--------------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| 1 | PRIMARY | integers | NULL | index | NULL | PRIMARY | 4 | NULL | 2615753 | 100.00 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 3 | DEPENDENT UNION | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 4 | DEPENDENT UNION | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
+----+--------------------+----------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
4 rows in set, 1 warning (0.00 sec)
Above returns results in about 1.35 sec
SELECT i
FROM integers
WHERE i in (
SELECT i FROM integers WHERE i = 100
UNION
SELECT i FROM integers WHERE i = 200
UNION
SELECT i FROM integers WHERE i = 1000
)
ORDER BY i;
+----+--------------------+--------------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+--------------------+--------------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
| 1 | PRIMARY | integers | NULL | index | NULL | PRIMARY | 4 | NULL | 2615753 | 100.00 | Using where; Using index |
| 2 | DEPENDENT SUBQUERY | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 3 | DEPENDENT UNION | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| 4 | DEPENDENT UNION | integers | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | Using index |
| NULL | UNION RESULT | <union2,3,4> | NULL | ALL | NULL | NULL | NULL | NULL | NULL | NULL | Using temporary |
+----+--------------------+--------------+------------+-------+---------------+---------+---------+-------+---------+----------+--------------------------+
5 rows in set, 1 warning (0.00 sec)
Above returns results in 1.6 secs.
The 'winner' is UNION ALL