Сколько индексов нужно создать для более быстрых запросов

0

Моя объектная модель приведена ниже и хотела бы, чтобы ваши входы на число индексов создавали для более быстрого ответа на запросы (на 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;
  • выберите * от пользователя, где организация = 1 и год = 2010 и isSytem = true или false; (то есть пользователей системы или пользователей, определенных приложениями).
  • выберите * от пользователя, где организация = 1 и год = 2010 и isSytem = false и userType = Manager (т.е. все менеджеры)
  • выберите * от пользователя, где организация = 1 и год = 2010 и isSytem = false и userType = Employee (т.е. все сотрудники)
  • выберите * от пользователя, где организация = 1 и год = 2010 и isSytem = false и userType = Manager и status = ACTIVE (т.е. активные пользователи)
  • выберите * от пользователя, где организация = 1 и год = 2010, и createdBy = 'Sam' или 'Joe' Требуется ли [6] другой индекс нескольких столбцов, состоящий из трех столбцов?

  • Поскольку мы создаем индекс с несколькими столбцами в соответствии с моим первоначальным допущением, могу ли я безопасно удалить отдельные индексы (idx_user_org_id, idx_user_year_id, idx_user_created_by), которые в настоящее время определены в модели?

  • 1
    Объясните, ваш лучший друг здесь
Теги:
database
jpa
indexing

1 ответ

2
Лучший ответ

Вы должны переключить порядок столбцов в вашем индексе:

(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] другой индекс нескольких столбцов, состоящий из трех столбцов?

Не требуется нужен новый индекс - он может использовать существующий, но менее эффективным способом - будут использоваться только первые два столбца. Однако добавление нового индекса для этого запроса выглядит как хорошая идея.

Можно ли безопасно удалить отдельные индексы

Да. Вы должны удалить неиспользуемые индексы, иначе они просто займут место на диске и замедлят изменения таблиц без каких-либо преимуществ.

  • 0
    Хорошо, что касается [6], если я создаю многостолбцовый индекс, используя (organization, year, creationBy), он будет использоваться вместо предыдущего индекса. Я прав?
  • 0
    @ user339108: Возможно, он будет использовать этот индекс, да. Вы должны запустить EXPLAIN SELECT ... чтобы узнать наверняка.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню