Задавайте вопросы, мы ответим
Вы не зашли.
Привет. Появилась проблема с запросом. Уже второй час пытаюсь решить, начинает крыша ехать(((. Суть проблемы: есть два запроса в одной хранимой процедуре. В зависимости от аргументов процедуры, выполняется либо первый запрос, либо второй. Запросы идентичны за исключением одной строки (на всякий случай приведу их оба). проблема в том, что первый выполняется быстро, в то время как второй афигенно долго. Вот фрагменты процедуры с этими запросами:
/* Этот запрос выполняется быстро */
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 выборка]
Не могу понять в чем причина такой разницы во времени выполнения для аналогичных запросов. Помогите разобраться.
Неактивен
у тебя city какого типа? varchar или int??? во втором запросе когда ты пишешь city > '0' mysql видать задумывается над тем какие типы ему сравнивать...
чисто предположение это все конечно...
сравнение строк на равность это нормально, но вот на большее или меньшее это уже хуже...
если city типа int, то попробуй написать без кавычек city > 0
Отредактированно kiligin (22.12.2009 00:20:57)
Неактивен
А explain над вторым запросом какой? Скорее всего, нет индекса на firms_city.city.
Неактивен