Как оптимизировать этот запрос (PDO + MYSQL) - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь оптимизировать этот запрос, связанный с таблицей из 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) ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...