Например. Таблица пользователей. У них есть поле MODERATED - нужно показывать чаще всего тех кто прошел модерацию. Тех кто не прошел значительно меньше(1-2%), но они есть.
* Мускуль по собственному желанию игнорирует индекс по этому полю,
* и запрос вместо 0,02 сек выполняется 10-20 секунд
Я не могу повлиять на сам запрос. Я узнал что в случае Boolean индекса мускуль любит его игнорировать, а как правильно поступить я ещё не знаю :)
Планировщику виднее, что делать с индексом с низкой кардинальностью.
0.02 с — это больше похоже на хит в кэш, а не на использование одного конкретного индекса.
Смысл в индексе этого поля был бы, если вам нужно было выбить выборку как раз из этих 1-2%. В обратную сторону эффективность как раз и будет 1-2%, вы ее даже не заметите. Нужно комбинировать индекс еще с чем-то.
Алексей Уколов, я сейчас пробовал. Если указать MODERATED=true и сортировку по двум полям, он игнорирует идекс по MODERATED и запрос выполняется дольше 10 секунд, так как таблица относительно большая. Если выкинуть сортировку или сортировать по одному полю, не меняя самого запроса, то индекс уже используется, и запрос выполняется меньше чем за секунду. Это именно запрос. Там нет кэша. Я в PMA проверял специально
Судя по вашему описанию, во втором случае просто используются данные индекса, без обращения к таблице. Соответственно, может помочь составной индекс. А может и не помочь.
Без схемы таблицы, запроса и результата команды explain дальнейшее обсуждение лишено смысла, мой дар провидения уже напряжён до предела.
Алексей Уколов, я EXPLAIN смотрю же. В одном случае есть индекс в другом он его отбрасывает - и я этот же запрос дополнительно запускаю посмотреть на скорость. Где индекс используется, там быстрее.
Я хз, может нужно как то иначе Модерированных отсеивать?
Алексей Уколов, оно очевидно отбрасывает индекс и не использует его. Я нашел инфу о том, что это обычное поведение потому как в индексе всего два значения 1 и 0 - оптимизитор считает его бесполезным.
Где-то встречал инфу, что нужно добавить в индекс что-то уникальное - например дату добавления, как составной индекс. Поэтому и спрашиваю - как правильно использовать индекс если у меня важная часть выборки идет по BOOL полю.
Вы эту инфу могли бы почерпнуть из первого и второго моих комментариев, где ровно это и написано. Больше мне нечего добавить, потому что в вопросе нет важной информации.
Если вы своим запросом дёргаете с диска 98% содержимого таблицы, то тут вам никакой индекс не поможет, гораздо эффективнее в таком случае всю таблицу с диска прочитать и отфильтровать, чем читать индекс и вразнобой дёргать с диска разные строчки, а потом их собрать воедино.
И оптимизатор прекрасно понимает эту особенность и использует только те индексы, которые помогут значительно снизить количество и объёмы чтений с диска.