I have tested a lot of variants (synthetic table, 10kk rows, colX = random in 1..10kk, value = random in 1..1kk). The most fast is:
CREATE INDEX idx ON test (value);
SELECT id
FROM test
WHERE id in (SELECT col1 FROM test WHERE value = 100)
UNION
SELECT id
FROM test
WHERE id in (SELECT col2 FROM test WHERE value = 200)
UNION
SELECT id
FROM test
WHERE id in (SELECT col3 FROM test WHERE value = 1000)
ORDER BY id;
mysql> SELECT id
-> FROM test
-> WHERE id in (SELECT col1 FROM test WHERE value = 100)
-> UNION
-> SELECT id
-> FROM test
-> WHERE id in (SELECT col2 FROM test WHERE value = 200)
-> UNION
-> SELECT id
-> FROM test
-> WHERE id in (SELECT col3 FROM test WHERE value = 1000)
-> ORDER BY id;
-- <output skipped>
36 rows in set (1.60 sec)
mysql> SELECT id
-> FROM test
-> WHERE (
-> id in (SELECT col1 FROM test WHERE value = 100)
-> OR
-> id in (SELECT col2 FROM test WHERE value = 200)
-> OR
-> id in (SELECT col3 FROM test WHERE value = 1000)
-> )
-> ORDER BY id;
-- <output skipped>
36 rows in set (29.18 sec)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…