Veneomin
@Veneomin

Как ускорить mysql запрос с JOIN LEFT?

SELECT * FROM `tbl_1` LEFT JOIN tbl_2 ON tbl_1.foto_id=tbl_2.i
d_fp AND tbl_2.sklad='Склад' WHERE ( deleted="no" AND `where`="arh" )  AND (`
type`="Cloth" ) ORDER BY `foto_id` asc LIMIT 9447,20;


tbl_1 - 20к записей
tbl_2 - 10к записей

Как ускорить выполнение таких запросов? Можно пример?
  • Вопрос задан
  • 1471 просмотр
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для начала - записать запрос понагляднее. В условиях ON записать поля присоединяемой таблицы в левых частях сравнений:
SELECT * 
  FROM `tbl_1` 
  LEFT JOIN `tbl_2` ON `tbl_2`.`id_fp` = `tbl_1`.`foto_id` AND `tbl_2`.`sklad` = 'Склад' 
  WHERE (deleted="no" AND `where`="arh")  AND (`type`="Cloth" ) 
  ORDER BY `foto_id` ASC 
  LIMIT 9447,20;

Теперь видно, что для ускорения JOIN'а стоит сделать в таблице `tbl_2` составной индекс (`id_fp`, `sklad`).
Затем надо смотреть EXPLAIN и, возможно, переносить условия из WHERE в предварительную выборку из `tbl_1`.
Но, если к одной строке из `tbl_1` присоединяется несколько строки из `tbl_2`, то ORDER BY и LIMIT надо оставить снаружи.
SELECT * 
  FROM (
    SELECT *
      FROM `tbl_1` 
      WHERE (deleted="no" AND `where`="arh")  AND (`type`="Cloth" ) 
      ORDER BY `foto_id` ASC 
      LIMIT 9447,20
  ) AS `t1`
  LEFT JOIN `tbl_2` ON `tbl_2`.`id_fp` = `t1`.`foto_id` AND `tbl_2`.`sklad` = 'Склад'

Ну и, напоследок, заменить * на необходимый список полей, чтобы не тянуть из базы лишние данные.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы