Podczas rutynowych prac natknąłem się na bardzo ciekawe zapytanie o następującym planie wykonania:
+----+--------------------+-----------------+------+---------------+------+---------+------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-----------------+------+---------------+------+---------+------+-------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 185 | |
| 2 | DERIVED | tab1 | ALL | NULL | NULL | NULL | NULL | 2869 | Using where; Using temporary; Using filesort |
| 2 | DERIVED | tab2 | ALL | NULL | NULL | NULL | NULL | 2869 | |
| 2 | DERIVED | tab3 | ALL | NULL | NULL | NULL | NULL | 2869 | |
| 2 | DERIVED | tab4 | ALL | NULL | NULL | NULL | NULL | 10483 | |
| 4 | DEPENDENT SUBQUERY | tab5 | ALL | NULL | NULL | NULL | NULL | 5613 | Using where |
| 3 | DEPENDENT SUBQUERY | tab6 | ALL | NULL | NULL | NULL | NULL | 2311 | Using where |
+----+--------------------+-----------------+------+---------------+------+---------+------+-------+----------------------------------------------+
7 rows in set (2 min 12.76 sec)
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+--------------------+-----------------+------+---------------+------+---------+------+-------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 185 | |
| 2 | DERIVED | tab1 | ALL | NULL | NULL | NULL | NULL | 2869 | Using where; Using temporary; Using filesort |
| 2 | DERIVED | tab2 | ALL | NULL | NULL | NULL | NULL | 2869 | |
| 2 | DERIVED | tab3 | ALL | NULL | NULL | NULL | NULL | 2869 | |
| 2 | DERIVED | tab4 | ALL | NULL | NULL | NULL | NULL | 10483 | |
| 4 | DEPENDENT SUBQUERY | tab5 | ALL | NULL | NULL | NULL | NULL | 5613 | Using where |
| 3 | DEPENDENT SUBQUERY | tab6 | ALL | NULL | NULL | NULL | NULL | 2311 | Using where |
+----+--------------------+-----------------+------+---------------+------+---------+------+-------+----------------------------------------------+
7 rows in set (2 min 12.76 sec)
Przyznam, że jest to swojego rodzaju rekord. Sam EXPLAIN wykonywał się kilka minut, zapytanie analizowało prawie 7 milionów rekordów. Co lepsze, zapytanie to do poindeksowania było banalne – SELECT z jednym podzapytaniem, w którego skład wchodziły OUTER JOINy. Skoro na załączonym przykładzie widać, że indeksowanie JOINów nie jest rzeczą oczywistą, to popatrzmy jak to można zrobić.
czytaj dalej…