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)

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…