MySQL query time

Тема в разделе "Базы данных", создана пользователем SimonSmith, 22 июл 2013.

Статус темы:
Закрыта.
Модераторы: latteo
  1. SimonSmith

    SimonSmith Постоялец

    Регистр.:
    25 сен 2008
    Сообщения:
    148
    Симпатии:
    33
    День добрый, столкнулся с большим временим отклика при обработке мульти JOIN's.
    Есть 3 таблицы
    about (~4,743 rows), delivery (~4,766 rows), pay (~5,877 rows)

    Делая первый селект в phpmyadmin
    Код:
    SELECT ja.*,
    jd.subscribe_user, jd.subscribe_abon_count, jd.subscribe_type, jd.subscribe_adress_deliver, jd.subscribe_city, jd.subscribe_zip
    FROM
             about as ja
    LEFT JOIN
             delivery as jd
    ON
              ja.subscribe_id = jd.subscribe_user
    ORDER BY ja.subscribe_date desc
    LIMIT 0,20
    
    результат: Showing rows 0 - 19 ( 20 total, Query took 0.0094 sec)


    далее, подключаю еще 1 таблицу
    Код:
    SELECT ja.*,
    jd.subscribe_user, jd.subscribe_abon_count, jd.subscribe_type, jd.subscribe_adress_deliver, jd.subscribe_city, jd.subscribe_zip,
    jp.pay_id, jp.subscribe_date as pay_date, jp.sum as pay_sum
    FROM
             about as ja
    LEFT JOIN
             delivery as jd
    ON
             ja.subscribe_id = jd.subscribe_user
    LEFT JOIN
             pay as jp                   
    ON
             ja.subscribe_idno = jp.subscribe_idno
    ORDER BY ja.subscribe_date desc
    LIMIT 0,20
    результат: Showing rows 0 - 19 ( 20 total, Query took 28.9111 sec)

    Время операции занимает огого сколько времени... Ок, пробую костыль:

    Код:
    SELECT ja.*, jd.subscribe_user, jd.subscribe_abon_count, jd.subscribe_type, jd.subscribe_adress_deliver, jd.subscribe_city, jd.subscribe_zip,
    (select jp.pay_id from pay as jp where ja.subscribe_idno=jp.subscribe_idno ) as pay_id,
    (select jp.subscribe_date from pay as jp where ja.subscribe_idno=jp.subscribe_idno ) as pay_date,
    (select jp.sum from pay as jp where ja.subscribe_idno=jp.subscribe_idno ) as pay_sum
    FROM
             about as ja
    LEFT JOIN
             delivery as jd
    ON
             ja.subscribe_id = jd.subscribe_user
    ORDER BY ja.subscribe_date desc
    LIMIT 0,20
    результат: Showing rows 0 - 19 ( 20 total, Query took 0.3365 sec)
    Но, тут проблема, ловим: "Subquery returns more than 1 row". Limit не устраивает.

    Использую LEFT JOIN т.к. нуждаюсь в нулл результатах из 3ей таблицы (pay). Вопрос: как уменьшить время обработки запроса с 3мя таблицами? Что со 2ым запросом не так?

    UPD:
    Решил проблему. Произошло чудо, таблица pay, имеет поле subscribe_idno, кодировка поля стояла latin1_swedish_ci. При любых запросах к этой базе все обрабатывалось медленно. Решил сменить кодировку на utf8_general_ci и все летает :confused:
     
Статус темы:
Закрыта.