Как создать индекс для столбца «ТЕКСТ» в базе данных MySQL с помощью JPA/Hibernate

Мне нужно создать индекс для столбца «ТЕКСТ» в базе данных MySQL. Я не могу сделать это, используя эту аннотацию

@Table(name = "table1", indexes = @Index(name = "ix_table1_column1", columnList = "column1"))

поскольку MySQL может индексировать только первые N символов столбца «ТЕКСТ», поэтому я получаю такое исключение:

BLOB/TEXT column 'column1' used in key specification without a key length

(очевидно, я не получаю это исключение, если я изменяю тип столбца с «ТЕКСТ» на «VARCHAR (255)»)

Я попытался создать индекс с помощью пользовательского запроса HQL, добавив метод в репозиторий:

@Query("create index ix_table1_column1 on Table1Entity(column1(255))") 
void createIndex();

но безуспешно, так как я получаю такие исключения:

unexpected token: create near line 1, column 1 [create index create index ix_table1_column1 on Table1Entity(column1(255))]

(похоже, в HQL нет команды «создать индекс»)

Однако с типом столбца 1 «ТЕКСТ» я могу создать индекс с помощью этого оператора в базе данных, где я просто добавляю ограничение на количество символов к имени столбца:

create index ix_table1_column1 on schema1.table1(column1(255));

Есть ли способ сделать это с помощью аннотации через пользовательский запрос HQL?

@Column(length = 255)
Jens 28.04.2023 13:39

Пробовал так, не помогло

Theodor 28.04.2023 14:06

«создать индекс создать индекс» - звучит так, будто Hibernate предоставляет «создать индекс», поэтому ваше указание является избыточным.

Rick James 04.05.2023 03:07
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Просто поместите команду:

create index ix_table1_column1 on schema1.table1(column1(255))

в файле .sql, а затем используйте стандартное свойство JPA jakarta.persistence.schema-generation.create-script-source, чтобы сообщить Hibernate, где его найти.

Привет, @Gavin, большое спасибо за идею, я сделал это немного по-другому, я просто добавил 'spring.datasource.data=classpath:data.sql', 'spring.jpa.defer-datasource-initialization= true» и «spring.sql.init.mode=always» в мой файл application.properties.

Theodor 04.05.2023 02:42

Давайте углубимся в то, что вы планируете делать с этим индексом.

  • Точное совпадение в длинном тексте? Это кажется маловероятным приложением.
  • Довольны проверкой только начала текста? Что ж, индекс «префикс» может помочь, а может и не помочь производительности. Пример: WHERE col LIKE 'Start%'
  • Ищете что-то в середине текста? Что ж, col LIKE '%abc%' не будет использовать индекс и будет работать медленно.
  • Надеетесь найти «слово» в тексте? Это требует индекса FULLTEXT и конструкции SELECT ... WHERE MATCH(col) AGAINST("word" IN BOOLEAN MODE) — это быстро и эффективно, но имеет ограничения.

Привет @Rick, спасибо за ваш комментарий, дело в том, что это проект по программированию в школе, где мне нужно запрограммировать приложение в соответствии с определенной спецификацией. И в этой спецификации явно указано, что колонка, где мне нужен этот индекс, должна быть типа Text. Вы абсолютно правы, нет необходимости искать точное совпадение для длинного текста, а строковые значения, которые должны храниться в этом столбце, совсем не такие длинные. Итак, самым простым способом решения проблемы было бы изменить тип с Text на Varchar, но я просто не могу отступить от спецификации, которую мне дали

Theodor 04.05.2023 02:50

У меня есть несколько слов, чтобы сказать об обучении начинающих индексированию префиксов. Это одна из наименее полезных конструкций в MySQL. Есть много других вещей, которыми можно заполнить классное время. [Не стесняйтесь отправить учителю этот комментарий.]

Rick James 04.05.2023 03:09

Другие вопросы по теме