@PetrW

При поиске по длине строки в MySQL индекс поля поможет или нет?

Есть таблица MySQL c полем field - varchar(255)

Надо выбрать все строки, где длина поля больше 10 символов
SELECT * FROM table WHERE LENGTH(field) > 10

Если добавить индекс по полю field - это ускорит запрос?
Если нет, то что может ускорить?
  • Вопрос задан
  • 798 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Стандартный индекс здесь не поможет. Но можно воспользоваться индексом по генерируемой колонке.
ALTER TABLE `table`
  ADD COLUMN `len` INT GENERATED ALWAYS AS (LENGTH(`field`)) VIRTUAL,
  ADD INDEX `by_length` (`len`)

Ну и в выборке использовать поле `len`
Ответ написан
Комментировать
Melkij
@Melkij
PostgreSQL DBA
Нет, не ускорит. Нужен функциональный индекс именно по length(field).

mysql 5.7.6 позволяет создать вычисляемые поля: https://dev.mysql.com/doc/refman/5.7/en/create-tab...
Это может быть STORED значение - т.е. будет занимать место как обычное поле, но вычисляться автоматически при добавлении/изменении строки. Может индексироваться всё с той же 5.7.6. И может быть virtual - такое поле вычисляется при обращении, не хранится на диске, но может индексироваться только с версии 5.7.8.

Если ваша версия старая и не умеет генерируемые колонки - то в вашем распоряжении всё ещё остаются старые методы для имитации функционального индекса: создаёте ещё одно числовое поле, куда сохраняете длину текста. Индексируете как обычно. За актуальностью данных могут следить пара триггеров на before insert и before update.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы