За последние 24 часа нас посетили 56556 программистов и 1685 роботов. Сейчас ищут 1267 программистов ...

Помогите оптимизировать запрос

Тема в разделе "PHP для новичков", создана пользователем Intrerio, 29 авг 2017.

  1. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Добрый день друзья. Мучусь с данным запросом уже месяц. Никак не могу заставить его работать быстрее.Нижче сам запрос и далее несколько слов от меня.
    PHP:
    1. $sel = 'SELECT DISTINCT blanks.nomer,blanks.status,blanks.date_start,blanks.date_end,blanks.date_ukl,blanks.price_manual,'                        . 'blanks.price_correct,blanks.date_first_mtsbu,blanks.status_perevirka,blanks.status_peredachi,'                    . 'oscpv_blank.strok,oscpv_blank.period_months,oscpv_blank.pilgy_coef,oscpv_blank.kilkist_coef,oscpv_blank.zona,'
    2.                         . 'oscpv_blank.bonus_coef,oscpv_blank.k1,oscpv_blank.k2,oscpv_blank.k3,oscpv_blank.k4,oscpv_blank.k5,oscpv_blank.k6,'
    3.                         . 'oscpv_blank.strok,oscpv_blank.ins_sum_majno,oscpv_blank.ins_sum_life,oscpv_blank.franshyza,oscpv_blank.taksi,oscpv_blank.otk,'
    4.                         . 'oscpv_blank.stag,'
    5.                         . 'users_docs.nazva AS nazva_doc,users_docs.seria AS seria_doc, users_docs.nomer AS nomer_doc,'
    6.                         . 'users.rezident,users.typosoby,users.inp,users.pip,users.birthday,users.sex,users.indeks,users.adress,'
    7.                         . 'oscpv_city.mtsbu, '
    8.                         . 'oscpv_avto.marka,oscpv_avto.model,oscpv_avto.nomer AS nomer_tz,oscpv_avto.vin,oscpv_avto.type_tz,oscpv_avto.rik,'
    9.                         . 'reestry_rd.nazva AS reestr_rd_nazva,'
    10.                         . 'pidrozdil.nazva AS pidrozdil_nazva,'
    11.                         . 'viddilennia.nazva AS viddilennia_nazva,'
    12.                         . 'reestry_mtsbu.nazva AS mtsbu_nazva,reestry_mtsbu.date_zvit AS date_reestr_mtsbu '                      
    13.                         . 'FROM blanks '
    14.                         . 'LEFT JOIN oscpv_blank ON oscpv_blank.blank_id=blanks.id '
    15.                         . 'LEFT JOIN users_docs ON oscpv_blank.client_docs_id=users_docs.id '
    16.                         . 'LEFT JOIN users ON oscpv_blank.client_id=users.id '
    17.                         . 'LEFT JOIN oscpv_avto ON oscpv_blank.avto_id=oscpv_avto.id '
    18.                         . 'LEFT JOIN oscpv_city ON oscpv_avto.misto=oscpv_city.nazva AND oscpv_avto.region=oscpv_city.oblast '
    19.                         . 'LEFT JOIN reestry_rd ON reestry_rd.id = blanks.reestr_rd '
    20.                         . 'LEFT JOIN pidrozdil ON pidrozdil.id = blanks.pidrozdil '
    21.                         . 'LEFT JOIN viddilennia ON viddilennia.id = blanks.viddilennia '
    22.                         . 'LEFT JOIN reestry_mtsbu ON reestry_mtsbu.id = blanks.reestr_mtsbu '                      
    23.                         . 'WHERE blanks.id IN ('.$explode_blanks.')';
    В переменной $explode_blanks находяться около 7500 значений типа: 1,2,3 и т.д.
    Какие варианты посоветуете для оптимизации данного запроса?
     
  2. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    План выполнения запроса покажите.
    $explode_blanks откуда приходит?
     
  3. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    На странице есть checkbox name="id[]" . При запуске сабмита массив уходит передаеться в метод public static function makeMtsbuExcel($blanks,$status). В методе он проходит такую вот операцию $explode_blanks = implode(",",$blanks);
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    индексы надеюсь присутствуют в БД?
     
  5. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Да. Причем, мускул не ругаеться на наличие лишних или отутствие индексов
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    ну если индексов не будет. или будут лишние - никто не будет ругаться, кроме того программера который потом будет все это поддерживать
    ... реально покажите explain запроса, какие индексы,
    ..а вообще ИМХО .. тут что то с архитектурой всего проекта... 7500 чекбоксов Карл! 7 тыс 500 !!!! ... это форма явно не для людей
     
  7. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    EXPLAIN чуток позже выведу. По поводу чекбоксов... На станице есть информация о договорах которые нужно выгрузить в систему ГосУчереждения. Менеджер кликает на верхний чек и отмечаются все чекбоксы. Причем такую методику становило само руководство компании.Я размышлял уже на тему разбить массив на части и в цыкле проводить запросы в БД, но мне кажеться что это твряд ли повлияет на производительность.Сейчас сделаю EXPLAIN
    --- Добавлено ---
    [​IMG]
    --- Добавлено ---
    Выборка данных на основании 4-параметров WHERE IN (1,2,3,4)
     
  8. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Так со своей стороны вы же можете сделать как угодно, лишь бы требованиям удовлетворяло.
    Например есть 7500, зачем делать IN, если это все id.
    Или отмечено 7495, проще указать NOT IN(1,20,100...)
    Ну и далее в таком духе.
     
  9. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Прошу прощения, наверное чего то недопонял.Если я селаю NOT IN то мне выгрузяться все договора которые не в этом диапазоне.Так ведь?
    --- Добавлено ---
    На страничке где чекбоксы лишь часть договоров которые есть в БД(в БД их около 200 000)
     
  10. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Во второй строчке type есть значение ALL. Не могу понять как изменить данный тип. Я уже и индексы повторно выставил и всеровно он дальше там
     
  11. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    по полю blank_id ?
     
  12. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Так точно
     
  13. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Количественно как соотносятся oscpv_blank и blanks?
    То есть на одну запись blanks сколько записей в oscpv_blank
     
  14. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    blanks - это база чистых договоров.
    oscpv_blank - это заключенные договора
    Тоесть на одну запись в blanks приходяться всего лишь одна запись в oscpv_blank .
    --- Добавлено ---
    В oscpv_blank информация о самом договоре. Вторая колонка это blank_id тоесть id из blanks
     
  15. t1grok

    t1grok Новичок

    С нами с:
    29 янв 2017
    Сообщения:
    119
    Симпатии:
    32
    Тогда нужно экспериментировать.
    Смотреть план выполнения запроса при разном размере в IN, не исключено, что при большой наборе могут еще какие-либо индексы отключаться, тк после поиска по индексу придется точечно выбирать много данных, а IO диска это жутко медленная штука.
    Пробовать перестроить, упростить запрос, посмотреть как ведет себя с FORCE INDEX (главное не увлекаться данной функцией), ну и само собой пробовать поиграться с настройками mysql.
    И в процессе, естественно замерять производительность запросов, обращая внимание не только на время выполнение, но и уровень использования буферов и т.д. Чем больше статистик соберете, тем большая ясность будет в сложившейся ситуации.

    В конце концов, можно сложить данные в mongoDB, главное не забывать актуализировать данные в данном хранилище или их вовремя инвалидировать.

    Еще есть, где "развернуться" для поиска решения проблемы.
     
  16. Intrerio

    Intrerio Активный пользователь

    С нами с:
    20 мар 2015
    Сообщения:
    176
    Симпатии:
    7
    Тоесть я понимаю что по значению ALL решения нет?
     
  17. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Подробную структуру таблиц в студию.