Z tego co widzę w logach bloga, jednym z przewijających się przez Google pytań jest pytanie o wydajność zapytania typu:

SELECT kol1, kol2 FROM tabela WHERE kol3 IN (1,2,3);

Na przykładzie bazy danych `sakila` sprawdźmy jak wygląda plan wykonania takiego SELECTa:

mysql> EXPLAIN SELECT * FROM rental WHERE customer_id IN (546, 67)\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: rental
type: range
possible_keys: idx_fk_customer_id
key: idx_fk_customer_id
key_len: 2
ref: NULL
rows: 47
Extra: Using where
1 row in set (0.00 sec)

Jak widać po zawartości kolumn type i key, zapytanie takie wykorzystuje indeks. Zapytanie typu ‚range’ zawsze korzysta z indeksu, natomiast wartość w kolumnie key wskazuje który indeks został użyty. Aby uzyskać wynik MySQL sprawdził 47 rekordów. Więcej informacji na temat poszczególnych typów znaleźć można w dokumentacji MySQL.

Tak więc mamy ładne, szybkie zapytanie. Sęk w tym, że często może być tak, że wygodniej byłoby napisać zapytanie w inny sposób:

SELECT * FROM rental WHERE customer_id IN (SELECT customer_id FROM customer WHERE first_name='KELLY');

Z punktu widzenia SQL jest to odpowiednik wcześniejszego zapytania, jako że wynikiem podzapytania są wartości 67 i 546:

mysql> SELECT customer_id FROM customer WHERE first_name='KELLY';
+-------------+
| customer_id |
+-------------+
|          67 |
|         546 |
+-------------+
2 rows in set (0.00 sec)

czytaj dalej…