Здравствуйте друзья. Для начала представлю Вам свой запрос: PHP: $sql = 'SELECT DISTINCT blanks.id,blanks.nomer,blanks.date_start,blanks.date_end,blanks.bank_kv,' . 'blanks.date_insert,blanks.price_manual,blanks.price_correct,blanks.comment_remark,blanks.suma_payment,blanks.date_payment,' . 'blanks.polis_dublikat,blanks.date_dublikat,blanks.status AS status_id,' . 'status.nazva AS status,' . 'pidrozdil.nazva AS pidrozdil_nazva,' . 'viddilennia.nazva AS viddilennia_nazva,' . 'a.pip AS agent_pip, ' . 'c.pip AS client_pip,c.inp,c.adress,c.birthday,c.phone, ' . 'oscpv_blank.bonus, oscpv_blank.franshyza,' . 'oscpv_avto.type_tz,oscpv_avto.nomer AS nomer_tz,oscpv_avto.marka,oscpv_avto.model,oscpv_avto.misto,oscpv_avto.zona,' . 'oscpv_avto.vin,oscpv_avto.rik ' . 'FROM blanks ' . 'LEFT JOIN pidrozdil ON blanks.pidrozdil=pidrozdil.id ' . 'LEFT JOIN viddilennia ON blanks.viddilennia=viddilennia.id ' . 'LEFT JOIN users a ON blanks.komu_peredacha=a.id ' . 'LEFT JOIN oscpv_blank ON blanks.id=oscpv_blank.blank_id ' . 'LEFT JOIN users c ON oscpv_blank.client_id=c.id ' . 'LEFT JOIN oscpv_avto ON oscpv_blank.avto_id=oscpv_avto.id ' . 'LEFT JOIN status ON status.id = blanks.status ' . 'WHERE reestr_rd = :id ORDER BY nomer ASC'; Теперь несколько слов о важных местах. Таблица blanks - 300000 записей, таблица oscpv_blank - 240 000 записей, таблица status - названия статусов договоров(около 5 записей). Запускаем запрос и получаме запись в slow.log (около 6 секунд). Меняем LEFT JOIN oscpv_blank на INNER JOIN oscpv_blank запрос прям летит но!!! не выводяться некоторые договора. Теперь более детально. В таблице blanks все договора компании (заключенные, чистые, испорчены и так далее). В таблице oscpv_blank ифонрмация по самому договору если он заключен. Тоесть, в таблицу oscpv_blank попадают не все договора с первой таблици. Значит когда мы делаем внутренний JOIN то получаме лишь то что однозначно есть в oscpv_blank, а нам то нужно не только те что есть там. А если делаем LEFT JOIN то запрос нагружает машину. Как посоветуете переделать запрос?
Оказалось все на много проще. В таблице blanks поле id имеет тип INT а в oscpv_blank поле blank_id имеет тип VARCHAR, а как известно индексы должны иметь одинаковый тип. Поменял blank_id на INT и запрос полетел а с ним и slow.log опустел.Проблема решена
Такое бывает, когда вместо использования внешних ключей архитектор БД полагается на человеческий фактор.