Добрый день друзья. Мучусь с данным запросом уже месяц. Никак не могу заставить его работать быстрее.Нижче сам запрос и далее несколько слов от меня. PHP: $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,' . 'oscpv_blank.bonus_coef,oscpv_blank.k1,oscpv_blank.k2,oscpv_blank.k3,oscpv_blank.k4,oscpv_blank.k5,oscpv_blank.k6,' . 'oscpv_blank.strok,oscpv_blank.ins_sum_majno,oscpv_blank.ins_sum_life,oscpv_blank.franshyza,oscpv_blank.taksi,oscpv_blank.otk,' . 'oscpv_blank.stag,' . 'users_docs.nazva AS nazva_doc,users_docs.seria AS seria_doc, users_docs.nomer AS nomer_doc,' . 'users.rezident,users.typosoby,users.inp,users.pip,users.birthday,users.sex,users.indeks,users.adress,' . 'oscpv_city.mtsbu, ' . 'oscpv_avto.marka,oscpv_avto.model,oscpv_avto.nomer AS nomer_tz,oscpv_avto.vin,oscpv_avto.type_tz,oscpv_avto.rik,' . 'reestry_rd.nazva AS reestr_rd_nazva,' . 'pidrozdil.nazva AS pidrozdil_nazva,' . 'viddilennia.nazva AS viddilennia_nazva,' . 'reestry_mtsbu.nazva AS mtsbu_nazva,reestry_mtsbu.date_zvit AS date_reestr_mtsbu ' . 'FROM blanks ' . 'LEFT JOIN oscpv_blank ON oscpv_blank.blank_id=blanks.id ' . 'LEFT JOIN users_docs ON oscpv_blank.client_docs_id=users_docs.id ' . 'LEFT JOIN users ON oscpv_blank.client_id=users.id ' . 'LEFT JOIN oscpv_avto ON oscpv_blank.avto_id=oscpv_avto.id ' . 'LEFT JOIN oscpv_city ON oscpv_avto.misto=oscpv_city.nazva AND oscpv_avto.region=oscpv_city.oblast ' . 'LEFT JOIN reestry_rd ON reestry_rd.id = blanks.reestr_rd ' . 'LEFT JOIN pidrozdil ON pidrozdil.id = blanks.pidrozdil ' . 'LEFT JOIN viddilennia ON viddilennia.id = blanks.viddilennia ' . 'LEFT JOIN reestry_mtsbu ON reestry_mtsbu.id = blanks.reestr_mtsbu ' . 'WHERE blanks.id IN ('.$explode_blanks.')'; В переменной $explode_blanks находяться около 7500 значений типа: 1,2,3 и т.д. Какие варианты посоветуете для оптимизации данного запроса?
На странице есть checkbox name="id[]" . При запуске сабмита массив уходит передаеться в метод public static function makeMtsbuExcel($blanks,$status). В методе он проходит такую вот операцию $explode_blanks = implode(",",$blanks);
ну если индексов не будет. или будут лишние - никто не будет ругаться, кроме того программера который потом будет все это поддерживать ... реально покажите explain запроса, какие индексы, ..а вообще ИМХО .. тут что то с архитектурой всего проекта... 7500 чекбоксов Карл! 7 тыс 500 !!!! ... это форма явно не для людей
EXPLAIN чуток позже выведу. По поводу чекбоксов... На станице есть информация о договорах которые нужно выгрузить в систему ГосУчереждения. Менеджер кликает на верхний чек и отмечаются все чекбоксы. Причем такую методику становило само руководство компании.Я размышлял уже на тему разбить массив на части и в цыкле проводить запросы в БД, но мне кажеться что это твряд ли повлияет на производительность.Сейчас сделаю EXPLAIN --- Добавлено --- --- Добавлено --- Выборка данных на основании 4-параметров WHERE IN (1,2,3,4)
Так со своей стороны вы же можете сделать как угодно, лишь бы требованиям удовлетворяло. Например есть 7500, зачем делать IN, если это все id. Или отмечено 7495, проще указать NOT IN(1,20,100...) Ну и далее в таком духе.
Прошу прощения, наверное чего то недопонял.Если я селаю NOT IN то мне выгрузяться все договора которые не в этом диапазоне.Так ведь? --- Добавлено --- На страничке где чекбоксы лишь часть договоров которые есть в БД(в БД их около 200 000)
Во второй строчке type есть значение ALL. Не могу понять как изменить данный тип. Я уже и индексы повторно выставил и всеровно он дальше там
Количественно как соотносятся oscpv_blank и blanks? То есть на одну запись blanks сколько записей в oscpv_blank
blanks - это база чистых договоров. oscpv_blank - это заключенные договора Тоесть на одну запись в blanks приходяться всего лишь одна запись в oscpv_blank . --- Добавлено --- В oscpv_blank информация о самом договоре. Вторая колонка это blank_id тоесть id из blanks
Тогда нужно экспериментировать. Смотреть план выполнения запроса при разном размере в IN, не исключено, что при большой наборе могут еще какие-либо индексы отключаться, тк после поиска по индексу придется точечно выбирать много данных, а IO диска это жутко медленная штука. Пробовать перестроить, упростить запрос, посмотреть как ведет себя с FORCE INDEX (главное не увлекаться данной функцией), ну и само собой пробовать поиграться с настройками mysql. И в процессе, естественно замерять производительность запросов, обращая внимание не только на время выполнение, но и уровень использования буферов и т.д. Чем больше статистик соберете, тем большая ясность будет в сложившейся ситуации. В конце концов, можно сложить данные в mongoDB, главное не забывать актуализировать данные в данном хранилище или их вовремя инвалидировать. Еще есть, где "развернуться" для поиска решения проблемы.