SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 19.12.2009 13:36:08

Orion189
Участник
Зарегистрирован: 19.12.2009
Сообщений: 1

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

Привет. Появилась проблема с запросом. Уже второй час пытаюсь решить, начинает крыша ехать(((. Суть проблемы: есть два запроса в одной хранимой процедуре. В зависимости от аргументов процедуры, выполняется либо первый запрос, либо второй. Запросы идентичны за исключением одной строки (на всякий случай приведу их оба). проблема в том, что первый выполняется быстро, в то время как второй афигенно долго. Вот фрагменты процедуры с этими запросами:

/* Этот запрос выполняется быстро */

IF category > '0' AND city = '0' THEN
  SELECT
    firms.id, firms.name, firms_contacts.phone, firms_contacts.about, firms.logo, firms_package.package
  FROM
    test.firms_contacts,
    test.firms,
    test.firms_city,
    test.firms_cat,
    test.firms_package
  WHERE
    firms_city.id_firm = firms.id
    AND firms_cat.id_firm = firms.id
    AND firms_contacts.id_firm = firms.id
    AND firms_package.id_firm = firms.id
    AND (firms_cat.category = category OR firms_cat.category = '0')
  GROUP BY
    firms.id
  ORDER BY
    firms_package.package
    DESC, firms.`date`
    DESC;
END IF;

/* Этот запрос выполняется медленно */

IF category = '0' AND city > '0' THEN
  SELECT
    firms.id, firms.name, firms_contacts.phone, firms_contacts.about, firms.logo, firms_package.package
  FROM
    test.firms_contacts,
    test.firms,
    test.firms_city,
    test.firms_cat,
    test.firms_package
  WHERE
    firms_city.id_firm = firms.id
    AND firms_cat.id_firm = firms.id
    AND firms_contacts.id_firm = firms.id
    AND firms_package.id_firm = firms.id
    AND (firms_city.city = city OR firms_city.city = '0')
  GROUP BY
    firms.id
  ORDER BY
    firms_package.package
    DESC, firms.`date`
    DESC;
END IF;

Таблицы firms_city и firms_cat небольшие, примерно по 200 строк каждая. Их структура и типы полей идентичны.

На моей машине (Athlon 3600 2.6 ГГц, 1 Гб ОЗУ) результаты запросов такие:

- первый запрос: Запрос открыт за 0,023c [0,022c выполнение, 0,001c выборка]
- второй запрос: Запрос открыт за 18,280c [18,279c выполнение, 0,001c выборка]


Не могу понять в чем причина такой разницы во времени выполнения для аналогичных запросов. Помогите разобраться.

Неактивен

 

#2 22.12.2009 00:19:13

kiligin
Завсегдатай
Зарегистрирован: 28.11.2009
Сообщений: 48

Re: Помогите разобраться с запросом

у тебя city какого типа? varchar или int??? во втором запросе когда ты пишешь city > '0' mysql видать задумывается над тем какие типы ему сравнивать...
чисто предположение это все конечно...
сравнение строк на равность это нормально, но вот на большее или меньшее это уже хуже...
если city типа int, то попробуй написать без кавычек city > 0

Отредактированно kiligin (22.12.2009 00:20:57)

Неактивен

 

#3 22.12.2009 16:52:28

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

Re: Помогите разобраться с запросом

А explain над вторым запросом какой? Скорее всего, нет индекса на firms_city.city.

Неактивен

 

Board footer

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