Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Долго выполняется двухуровневый запрос 
:(
    Опции темы
neokortex
Дата 25.11.2010, 04:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 19.3.2007

Репутация: нет
Всего: нет



Очень долго выполняется такой запрос
Код

SELECT *
FROM `products`
WHERE `dir`
IN (

SELECT MIN( `dir` ) AS `mindir`
FROM `products`
WHERE `text` LIKE '%текст%'
)
AND `text` LIKE '%текст%';

phpMyAdmin показывает 3,5 секунды
В чем может быть дело?
PM MAIL   Вверх
neokortex
Дата 25.11.2010, 05:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 19.3.2007

Репутация: нет
Всего: нет



нашел в чем проблема. надо =, а не IN
Код

SELECT *
FROM `products`
WHERE `dir`
= (
SELECT MIN( `dir` ) AS `mindir`
FROM `products`
WHERE `text` LIKE '%текст%'
)
AND `text` LIKE '%текст%';

теперь 0.0015 сек.
Обалдеть какая разница во времени. Это почему так, никто не подскажет?
PM MAIL   Вверх
Akina
Дата 25.11.2010, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



См. explain запросов.

Добавлено через 1 минуту и 34 секунды
А заодно и
Код

SELECT *
FROM `products`
WHERE `text` LIKE '%текст%'
ORDER BY `dir` ASC
LIMIT 1;




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
A5uKa
  Дата 25.11.2010, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: нет
Всего: 16



Цитата(Akina @ 25.11.2010,  08:35)
Добавлено @ 08:37
А заодно и
Код

SELECT *
FROM `products`
WHERE `text` LIKE '%текст%'
ORDER BY `dir` ASC
LIMIT 1;

Разве так оно не выберет только одну запись ?
PM   Вверх
Akina
Дата 25.11.2010, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(A5uKa @  25.11.2010,  09:52 Найти цитируемый пост)
Разве так оно не выберет только одну запись ? 

выберет одну... с минимальным dir... Да, если dir неуникально - это (может быть) не то, что хочет ТС.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
A5uKa
  Дата 25.11.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: нет
Всего: 16



Код

SELECT Min ('dir') , и остальные поля
FROM `products`
WHERE `text` LIKE '%текст%';

а как такое будет работать ?
PM   Вверх
Akina
Дата 25.11.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(A5uKa @  25.11.2010,  10:06 Найти цитируемый пост)
а как такое будет работать ? 

Отфонарно. Остальные поля будут браться из любых записей (с dir=Min(dir), и то если звёзды сложатся).


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
A5uKa
  Дата 25.11.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: нет
Всего: 16



Код

SELECT Min ('p1.dir') , p2.остальные поля
FROM `products` AS p1,  `products` AS p2, 
WHERE p2.`text` LIKE '%текст%' AND p1.dir=p2.dir;

то есть только так ?
PM   Вверх
baldina
Дата 25.11.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(A5uKa @  25.11.2010,  09:06 Найти цитируемый пост)
а как такое будет работать ? 

GROUP BY надо, и будет
PM MAIL   Вверх
Zloxa
Дата 25.11.2010, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(A5uKa @  25.11.2010,  09:54 Найти цитируемый пост)
то есть только так ? 

это ничего не меняет. Джойн выполнится раньше аггрегации и "Остальные поля" будут отобраны так же - первые попавшиеся
если уходить от in к джойну, то както так:
Код

select `p2`.*
from  (select `p1`.`dir`
        from `products` as `p1`
        where p2.`text` like '%текст%'
        order by `p1`.`dir`
        limit 1
      ) as `s`
      ,`products` AS `p2` 
WHERE p1.dir=p2.dir and p2.`text` like '%текст%';

Здесь, в принципе, пофиг, использовать лимит или min, критерии отбора не позволят использоывать индекс.
Если бы можно было использовать индекс, limit, думаю/*уверен на 80%*/, был бы предпочтительнее min

Явных преимуществ использования джойн в место in - я не вижу. Иногда стоит попробовать, когда in дает не желательный план, может статься план с джойном будет более удовлетворителен - т.е. юзабилити такого подхода мне видится лишь в целях обмана оптимизатора.

В довесок размышления в слух:
Для реализации операции in может быть выполнен semi-join, алгоритм его реализации для конкретной платформы может отличаться от от алгоритма inner-join, что может дать преимущество тому или иному подходу. Однако, на практике, сколько я ни пытался получить разницу времени отклика превосходящую погрешность измерения при сопоставимых стоимостях планов - мне не удавалось.

Это сообщение отредактировал(а) Zloxa - 25.11.2010, 11:16


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
A5uKa
  Дата 25.11.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: нет
Всего: 16



Цитата(baldina @ 25.11.2010,  10:03)
Цитата(A5uKa @  25.11.2010,  09:06 Найти цитируемый пост)
а как такое будет работать ? 

GROUP BY надо, и будет

Ок )
PM   Вверх
Zloxa
Дата 25.11.2010, 10:58 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(neokortex @  25.11.2010,  05:20 Найти цитируемый пост)
Это почему так, никто не подскажет? 

как верно уже заметил Akina, попытка что либо предполагать без изучения планов обоих запросов - абсурдна.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0848 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.