Я пытаюсь оптимизировать этот запрос, связанный с таблицей из 500 000 строк.
Содержит три подзапроса с небольшими таблицами (200> строк <1000). </p>
Теперь, глядя на phpmyadmin, время выполнения составляет около 0,9 секунды, а при печати некоторых временных переменных с использованием PHP оно увеличивается примерно до 2,2.
Я пытался использовать индексы, но использование подзапросов, кажется, нарушает использование индекса (глядя на результат EXPLAIN)
SELECT `year`, `month`,`origin`, `destination`, `quantity`, LEFT(`hs_code` , 6) as code
FROM table_x as tab WHERE (`origin` = (SELECT `code` FROM `table_y` as tab2
WHERE tab2.`region_id`=1 AND tab2.`code`= tab.`origin`) AND `destination` = (SELECT `code` FROM `table_y` as tab2 WHERE tab2.`region_id`=1 AND tab2.`code`= tab.`destination`)) AND `hs_code` = (SELECT `code` FROM table_z WHERE `code`=tab.hs_code AND ((`type`='2' AND `sub_type`='1' ) OR (`type`='2' AND `sub_type`='2' ) OR (`type`='2' AND `sub_type`='3' ) OR (`type`='2' AND `sub_type`='4' ) OR (`type`='2' AND `sub_type`='5' ) OR (`type`='2' AND `sub_type`='6' )) LIMIT 1) AND export=1 AND `year`>=2016 AND (`year`<2019 OR (`year`=2019 AND `month`<=3)) ORDER BY `year` ASC, `month` ASC,`origin` ASC,`destination` ASC
Это EXPLAIN outout
1 ОСНОВНОЙ экспорт ссылки на вкладку, table_x_index_origine, table_x_ind ...
экспорт 1 конст 188731 Использование индекса условия; Используя где; С помощью
FileSort
4 ЗАВИСИМОЕ ОТПРАВЛЕНИЕ table_z ref code, tipologia code 767
tab.hs_code 6 Использование где
3 ЗАВИСИМОЕ ОТПРАВЛЕНИЕ tab2 eq_ref PRIMARY, table_y_index PRIMARY 6
tab.destination 1 Использование где
2 ЗАВИСИМОЕ ОТПРАВЛЕНИЕ tab2 eq_ref PRIMARY, table_y_index PRIMARY 6
tab.origin 1 Использование где
и это структура таблицы:
id - INT | hs_code - VARCHAR | экспорт - INT | происхождение - CHAR | место назначения -
CHAR | количество - INT | значение - INT | год - INT | месяц - INT
Для меня 0.9S времени выполнения было бы хорошо, но я никак не могу добиться этого результата в PHP (используя PDO) ...