LINUX.ORG.RU

Проблема с оптимизацией запроса в MySQL


0

0

Есть 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 Время работы все равно измеряется в секундах, хотя каждый из этих запросов выполняется очень быстро.

Подскажите, как можно ускорить?

★★★★★

Полтора миллиона записей в tbl2. Еще я использую LIMIT 300 в запросах, если это важно. MySQL 4.1.3beta.

Sorcerer ★★★★★
() автор топика

Возможно я недопонял, но еще в FoxPro оптимальнее было иметь два индекса id и str вместо одного составного (id,str)
Ну и от туда-же, для оптимизации необходимо индесировать все поля, учавствующие в отборе записей. В данном случае tbl1.flag

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.