2016-03-30 14 views
4

Ich habe eine Tabelle Term mit etwas mehr als 5 Millionen Zeilen. Jede Zeile besteht aus einer ID und einem "Namen". Eine Suche mit dem Feld "Name" dauert fast 35 Sekunden.Erstellt Hibernate automatisch Index?

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

Das Skript aus der von Hibernate generierte Tabelle:

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 Anmerkung:

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

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

Es ist so langsam auf dem Feld "Namen" zu suchen, so dass ich denke, es ist kein Index. Erstellt Hibernate automatisch Index für ID und Name in dieser Tabelle? Wenn nicht, wie lässt man Index für beide erstellen?

Antwort

2

Verwenden Sie die @Index Anmerkung:

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

Hibernate den Index automatisch erstellen, wenn es in der Tabelle beim Start erzeugt.

+0

Muss ich auf die column ‚id‘ hinzufügen? Oder Primärschlüssel "ID" wird automatisch indiziert. – user697911

+0

Guter Fang habe ich aktualisiert. –

+0

Warum haben Sie nur einen Namen = "name_idx"? Brauchen Sie einen anderen Namen für den Index 'id'? – user697911

0

Der Primärschlüssel wird automatisch für das name Feld indiziert, müssen Sie eine @Index Anmerkung hinzufügen:

@NotNull 
@Size(min = 1, max = 100) 
@Index(name = "idx_name") 
private String name; 
Verwandte Themen