SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.04.2010 13:22:05

Артём Н.
Активист
Зарегистрирован: 03.11.2009
Сообщений: 156

Оптимизация поискового запроса

Поисковый запрос примерно такого вида:

Код:

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);

Всё-равно: "Ну и запросы у вас, - сказала СУБД и зависла." sad

Как его возможно оптимизировать? С учётом того, что функциональность like %*% крайне желательно сохранить, и запрос должен иметь достаточно "регулярную", простую структуру, чтобы его было возможно было формировать динамически?

Отредактированно Артём Н. (30.04.2010 13:24:39)


"И ни птица, ни ива слезы не прольет,
Если сгинет с земли человеческий род.
И весна, и весна встретит новый рассвет,
Не заметив, что нас уже нет..."

Неактивен

 

#2 30.04.2010 17:19:23

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Оптимизация поискового запроса

Она не зависла, а задумалась smile

Любой LIKE "%blah%" — это полное сканирование таблицы. Вы это используете
в двух табличках. Допустим, у Вас есть две таблички — небольшие — по 100
строк. Для того, чтобы выполнить Ваш запрос, надо просканировать
100 × 100 = 10 000 строк. А если таблички больше — то больше. Остальные слова
в запросе влияют уже мало — пока остаются такие LIKE — ничего не сделаешь.

Задумайтесь, например, о полнотекстовом индексе.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson