У меня есть две таблицы, одна для маршрутов и одна для аэропортов.
Маршруты содержат чуть более 9000 строк, и я проиндексировал каждый столбец.
В аэропортах только 2000 строк, и я также проиндексировал каждый столбец.
Когда я запускаю этот запрос, для возврата 300 строк может потребоваться до 35 секунд:
SELECT routes.* , a1.name as origin_name, a2.name as destination_name FROM routes
LEFT JOIN airports a1 ON a1.IATA = routes.origin
LEFT JOIN airports a2 ON a2.IATA = routes.destination
WHERE routes_build.carrier = "Carrier Name"
Запустив его с «DESCRIBE», я получаю следующую информацию, но я не на 100% уверен в том, что она говорит мне.
id | Select Type | Table | Type | possible_keys | Key | Key_len | ref | rows | Extra
--------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | routes_build | ref | carrier,carrier_2 | carrier | 678 | const | 26 | Using where
--------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | a1 | ALL | NULL | NULL | NULL | NULL | 5389 |
--------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | a2 | ALL | NULL | NULL | NULL | NULL | 5389 |
--------------------------------------------------------------------------------------------------------------------------------------
Единственная альтернатива, о которой я могу подумать, - это запустить два отдельных запроса и соединить их с PHP, хотя я не могу поверить, что что-то подобное может убить сервер mysql. Так что, как обычно, я подозреваю, что делаю что-то глупое. SQL - моя слабость номер 1.