| AlexPetrovich 
 Junior Member
 | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору SERGE_BLIZNUK
 Хинты - подсказки серверу выполнить запрос наилучшим образом.
 В данном случае в таблице 5 млн записей, а второе условие
 t.grade_id between 0 and 3000000
 выбирает из них 3 млн, т.е 60% объема. Выборка с использованием индекса по t.grade_id получается неэффективной.
 
 Но так как есть первое условие
 t.parent_id between 5 and 5
 которое выбирает только 1 запись, то индексный поиск по второму в принципе лишний.
 
 Поэтому второе условие записываем в виде
 t.grade_id+0 between 0 and 3000000
 где (+0) - приводит к тому, что с левой стороны условия появляется выражение и по нему не будет использоваться индексный поиск. Соответственно меняется план запроса и используется только один индекс, который в данном конкретном запросе "полезен".
 
 В сложных запросах хинтами мажно отключить какой-то один не нужный индекс, а использование остальных отдать на усмотрение оптимизатора (который сможет подстраивать план в зависимосити от  селективности индексов).
 Если же прописывать план полностью вручную - то тут вся ответственность целиком на программере, который должен понимать, какие у него данные в БД и какие запросы будут на них работать.
 
 В данном примере на 5 млн записей только у 25 из них прописан parent_id, у остальных null.
 Т.е. очень не равномерное заполнение, поэтому оптимизатор выбрал не самый скоростной план.
 Но это скорее исключение, т.к. стоит немного поменять цифры в параметрах запроса и предложенный оптимизатором план станет лучшим по скорости.
 
 Индексы - это не всегда полезно. Нужно думать как они будут использоваться. А то повесят на все 30 полей в таблице индексы, а потом вопросы - почему такие тормоза ?
 |