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 полей в таблице индексы, а потом вопросы - почему такие тормоза ? |