Мне нужно создать индекс для столбца «ТЕКСТ» в базе данных 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?
Пробовал так, не помогло
«создать индекс создать индекс» - звучит так, будто Hibernate предоставляет «создать индекс», поэтому ваше указание является избыточным.
Просто поместите команду:
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.
Давайте углубимся в то, что вы планируете делать с этим индексом.
WHERE col LIKE 'Start%'
col LIKE '%abc%'
не будет использовать индекс и будет работать медленно.FULLTEXT
и конструкции SELECT ... WHERE MATCH(col) AGAINST("word" IN BOOLEAN MODE)
— это быстро и эффективно, но имеет ограничения.Привет @Rick, спасибо за ваш комментарий, дело в том, что это проект по программированию в школе, где мне нужно запрограммировать приложение в соответствии с определенной спецификацией. И в этой спецификации явно указано, что колонка, где мне нужен этот индекс, должна быть типа Text. Вы абсолютно правы, нет необходимости искать точное совпадение для длинного текста, а строковые значения, которые должны храниться в этом столбце, совсем не такие длинные. Итак, самым простым способом решения проблемы было бы изменить тип с Text на Varchar, но я просто не могу отступить от спецификации, которую мне дали
У меня есть несколько слов, чтобы сказать об обучении начинающих индексированию префиксов. Это одна из наименее полезных конструкций в MySQL. Есть много других вещей, которыми можно заполнить классное время. [Не стесняйтесь отправить учителю этот комментарий.]
@Column(length = 255)