Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Проблема с оптимизацией запроса (Sorcerer) 17/08/2004 - 11:54:25
      Re: Проблема с оптимизацией запроса (Dubrovsky) 17/08/2004 - 16:54:27
      Re: Проблема с оптимизацией запроса (простохуй) 17/08/2004 - 19:37:38
      Re: Проблема с оптимизацией запроса (Dinky) 17/08/2004 - 20:22:47

> Original message text:
> From: Sorcerer - 17/08/2004 - 11:54:25
> Subject:Проблема с оптимизацией запроса
> -----------------
> Есть 2 таблицы - tbl1(id,flag), tbl2(id,str). В таблицах есть и другие поля, не имеющие значения. Требуется получить все строки tbl2, у которых id совпадает с id tbl1 с flag=1 и str совпадает с одним из заранее известных значений. В tbl1 строк мало, она не очень интересна, а в tbl2 - около полутора миллионов.
>
> Есть индекс для tbl2 по (id,str).
>
> Если возможен только один вариант строки, то все работает быстро таким запросом: SELECT * FROM tbl2 LEFT JOIN tbl1 USING(id) WHERE str='value' AND flag=1
>
> Если же возможно несколько вариантов строки (пусть всего 2 варианта), то тут начинаются проблемы со скоростью. Возможные варианты:
>
> 1. SELECT * FROM tbl2 LEFT JOIN tbl1 USING(id) WHERE str IN ('value1', 'value2') AND flag=1 Работает гораздо медленее (10 секунд вместо 0.2 для первого варианта), хотя индекс для tbl2 и используется (видимо, только id от этого индекса используется).
>
> 2. SELECT * FROM tbl2 LEFT JOIN tbl1 USING(id) WHERE str='value1' AND flag=1 UNION ALL SELECT * FROM tbl2 LEFT JOIN tbl1 USING(id) WHERE str='value2' AND flag=1 Время работы всего запроса равно измеряется в секундах, хотя каждый из этих запросов отдельно выполняется очень быстро.
>
> Подскажите, как можно ускорить?
>
> MySQL 4.1.3beta, tbl2 имеет тип MyISAM, tbl1 - InnoDB. Ко всем запросам добавляется также LIMIT 300.
>


From: Dinky - 17/08/2004 - 20:22:47
Subject:Проблема с оптимизацией запроса
-----------------
1) я совершенно не понял зачем LEFT JOIN нужен, плюс, если строк в t1 мало, то лучше их выбрать в массив и дергать из t2 в цикле, чтобы join-ов вообще не было ;)
2) "WHERE str IN ('value1', 'value2')" все равно что "OR" ;) т.е. индекс используется куда менее эффективно чем константа, т.ч. если "всего два варианта", то будет быстрее получить двумя селектами (то же верно и для 10 значений ;)
3) вообще, работать так со строками - значит закладываться на бОльшие задержки и/или более дорогое железо ;) Если строки повторяющиеся, то лучше их засунуть в отдельную табличку, а в tb2 вставлять str_id оттуда. Другой вариант - испольщовать хэш или md5...

--
Dmitry



[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
16684



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |