Моя объектная модель приведена ниже и хотела бы, чтобы ваши входы на число индексов создавали для более быстрого ответа на запросы (на h2, mysql). Допущения и вопросы даются ниже следующей модели.
@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;
@ManyToOne(fetch = FetchType.LAZY)
@ForeignKey(name = "fk_user_org_id")
@Index(name = "idx_user_org_id")
@JoinColumn(name = "org_id", nullable = false, referencedColumnName = "id")
@NotNull
private Organization organization;
@ManyToOne(fetch = FetchType.LAZY)
@ForeignKey(name = "fk_user_year_id")
@Index(name = "idx_user_year_id")
@JoinColumn(name = "year", nullable = false, referencedColumnName = "id")
@NotNull
private Year year;
@ManyToOne(fetch = FetchType.LAZY)
@ForeignKey(name = "fk_user_created_by")
@Index(name = "idx_user_created_by")
@JoinColumn(name = "created_by", nullable = false, referencedColumnName = "id")
@NotNull
private User createdBy;
@Column(name = "name", nullable = false)
private String name;
@Column(name = "desc")
private String desc;
@Column(name = "is_system", length = LEN_1)
@Type(type = "org.hibernate.type.YesNoType")
private boolean isSystem = false;
@Column(name = "user_type", nullable = false)
private UserType userType;
@Column(name = "status", nullable = false)
@NotNull
private Status status;
}
Наш план состоит в том, чтобы использовать индексы с несколькими столбцами вместо одного индекса столбца (т.е. создавать индекс user_idx на основе (организация, год, isSystem, статус, userType, createdBy)). Предполагая, что у меня есть этот индекс, я получу оптимизированные ответы для моих запросов, перечисленных ниже.
выберите * от пользователя, где организация = 1 и год = 2010, и createdBy = 'Sam' или 'Joe' Требуется ли [6] другой индекс нескольких столбцов, состоящий из трех столбцов?
Поскольку мы создаем индекс с несколькими столбцами в соответствии с моим первоначальным допущением, могу ли я безопасно удалить отдельные индексы (idx_user_org_id, idx_user_year_id, idx_user_created_by), которые в настоящее время определены в модели?
Вы должны переключить порядок столбцов в вашем индексе:
(organization, year, isSystem, userType, status, createdBy)
Это позволяет ему лучше обслуживать эти два запроса:
select * from user where organization=1 and year=2010 and isSystem=false and userType=Manager
select * from user where organization=1 and year=2010 and isSystem=false and userType=Employee
Требуется ли [6] другой индекс нескольких столбцов, состоящий из трех столбцов?
Не требуется нужен новый индекс - он может использовать существующий, но менее эффективным способом - будут использоваться только первые два столбца. Однако добавление нового индекса для этого запроса выглядит как хорошая идея.
Можно ли безопасно удалить отдельные индексы
Да. Вы должны удалить неиспользуемые индексы, иначе они просто займут место на диске и замедлят изменения таблиц без каких-либо преимуществ.
EXPLAIN SELECT ...
чтобы узнать наверняка.