Задавайте вопросы, мы ответим
Вы не зашли.
Поисковый запрос примерно такого вида:
select *, CONCAT_WS(" ", DOG_SER, DOGNUMB) as FULL_NUM, CONCAT_WS(" ", car.CAR_MARK, car.CAR_MODEL) as FULL_MODEL, car.ID_CLIENT as ID_OWNER, CONCAT_WS(" ", client.surname, client.name, client.middlename) as FULL_NAME , CONCAT_WS(", ", if(client.country = '', null, client.country), if(client.region = '', null, client.region), if(client.town = '', null, client.town), if(client.street = '', null, client.street), if(client.home = '', null, client.home), if(client.korpus = '', null, client.korpus), if(client.flat = '', null, client.flat)) as FULL_ADDRESS from dogovor, dogovor_type, client, car, car_type where ((dogovor.ID_DOGOVOR_TYPE = dogovor_type.ID_DOGOVOR_TYPE) and (dogovor.ID_CLIENT = client.ID_CLIENT) and (dogovor.ID_CAR = car.ID_CAR)) and (car.ID_CAR_TYPE = car_type.ID_CAR_TYPE) and (DOGNUMB like '%123%' ) or dogovor.ID_CLIENT in ( select ID_CLIENT from client, client_types where ((SURNAME like '%Петрова%' ) and (client_types.ID_CLIENT_TYPE_GROUP = 1 and client_types.ID_CLIENT_TYPE = client.ID_CLIENT_TYPE)) or ((DOC_SER like '%12%' ) and ID_TYPE_DOC = 0)) or dogovor.ID_CAR in ( select ID_CAR from car where (VIN_NUM like '%000%' ))
Как не сложно догадаться, при выполнении такого запроса, всё намертво зависало.
Сейчас я попытался его оптимизировать, сделал таким:
select *, CONCAT_WS(" ", car.CAR_MARK, car.CAR_MODEL) as FULL_MODEL, car.ID_CLIENT as ID_OWNER, CONCAT_WS(" ", client.surname, client.name, client.middlename) as FULL_NAME , CONCAT_WS(", ", if(client.country = '', null, client.country), if(client.region = '', null, client.region), if(client.town = '', null, client.town), if(client.street = '', null, client.street), if(client.home = '', null, client.home), if(client.korpus = '', null, client.korpus), if(client.flat = '', null, client.flat)) as FULL_ADDRESS from dogovor_type, car_type, client_types, dogovor join car on (dogovor.ID_CAR = car.ID_CAR) and (VIN_NUM like '%000%') , dogovor dg1 join client on (dg1.ID_CLIENT = client.ID_CLIENT) and (SURNAME like '%Петрова%' ) or ((DOC_SER like '%12%' ) and ID_TYPE_DOC = 0) where (dogovor.ID_DOGOVOR_TYPE = dogovor_type.ID_DOGOVOR_TYPE) or (dogovor.DOGNUMB like '%123%' ) and (car.ID_CAR_TYPE = car_type.ID_CAR_TYPE) and (client_types.ID_CLIENT_TYPE_GROUP = 2 and client_types.ID_CLIENT_TYPE = client.ID_CLIENT_TYPE);
Всё-равно: "Ну и запросы у вас, - сказала СУБД и зависла."
Как его возможно оптимизировать? С учётом того, что функциональность like %*% крайне желательно сохранить, и запрос должен иметь достаточно "регулярную", простую структуру, чтобы его было возможно было формировать динамически?
Отредактированно Артём Н. (30.04.2010 13:24:39)
Неактивен
Она не зависла, а задумалась
Любой LIKE "%blah%" — это полное сканирование таблицы. Вы это используете
в двух табличках. Допустим, у Вас есть две таблички — небольшие — по 100
строк. Для того, чтобы выполнить Ваш запрос, надо просканировать
100 × 100 = 10 000 строк. А если таблички больше — то больше. Остальные слова
в запросе влияют уже мало — пока остаются такие LIKE — ничего не сделаешь.
Задумайтесь, например, о полнотекстовом индексе.
Неактивен