2016-03-30 3 views
4

У меня есть таблица Term с чуть более 5 миллионов строк. Каждая строка состоит из идентификатора и имени. Поиск с полем «имя» занимает почти 35 секунд.Hibernate автоматически создает индекс?

MariaDB [WordDS]> select * from Term where name="Google"; 
+---------+--------+ 
| id  | name | 
+---------+--------+ 
| 1092923 | Google | 
+---------+--------+ 
1 row in set (35.35 sec) 

Сценарий из таблицы генерируемой Hibernate:

DROP TABLE IF EXISTS `Term`; 
/*!40101 SET @saved_cs_client  = @@character_set_client */; 
/*!40101 SET character_set_client = utf8 */; 
CREATE TABLE `Term` (
    `id` bigint(20) NOT NULL, 
    `name` varchar(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
/*!40101 SET character_set_client = @saved_cs_client */; 

Java аннотаций:

@Id 
@Column(unique=true) 
private long id; 

@NotNull 
@Size(min = 1, max = 100) 
private String name; 

Это настолько медленно, чтобы искать на поле "имя", так что я предполагаю, что есть нет индекса. Hibernate автоматически создает индекс для идентификатора и имени в этой таблице? Если нет, то как это сделать, чтобы создать индекс для обоих?

ответ

2

Используйте @Index аннотацию:

@Entity 
@Table(name = "Term", indexes = { 
    @Index(columnList = "name, id", name = "name_idx") }) 

Hibernate создает индекс автоматически, когда он создает таблицу при запуске.

+0

Мне нужно добавить «идентификатор» в columnList Do? Или первичный ключ «id» будет автоматически проиндексирован. – user697911

+0

Хороший улов, который я обновил. –

+0

Почему у вас есть только одно имя = "name_idx"? Вам нужно другое имя для индекса id? – user697911

0

Первичный ключ индексируется автоматически, для name поля, вы должны добавить @Index аннотации:

@NotNull 
@Size(min = 1, max = 100) 
@Index(name = "idx_name") 
private String name; 
Смежные вопросы