@Ne7Le4Der

Как правильно использовать индексы PostgreSQL?

Есть две таблицы A и B.

A
@Column({
        type: DataType.UUID,
        defaultValue: UUIDV4,
        primaryKey: true,
        unique: true,
        allowNull: false
    })
    id: string;

  @Column({
        type: DataType.INTEGER,
        allowNull: false,
        defaultValue: StatusEnum.PENDING
    })
    status: StatusEnum;


B
@Column({
        type: DataType.UUID,
        defaultValue: UUIDV4,
        primaryKey: true,
        unique: true,
        allowNull: false
    })
    id: string;

    @Index('time')
    @Column({
        type: DataType.DATE,
        allowNull: false
    })
    time: Date;

    @Column({
        type: DataType.FLOAT,
        allowNull: false
    })
    value: number;

    @ForeignKey(() => ATable)
    a_id: string


Я думаю не привязываясь к языку программирования суть ясна - в таблице A поля id и status, в таблице B поля id, time, value и a_id

A has many B

В таблице B порядка 5.000.000 (размер ~1гб)

Использую ORM, но даже простой
SELECT * FROM b WHERE a_id='123' ORDER BY time DESC;

Выполняется 0.3c - 1c в зависимости от количества строк в ответе. Так же очень медленно выполняется INSERT. Почитав с какими объёмами работают другие пользователи понял, что что-то явно не так.

Вопрос: ускоряет ли index операцию ORDER BY, и в чем вообще может быть проблема? Настройки, железо, или я неправильно использую index?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
phoinixrw
@phoinixrw
Архитектор информационных систем
1. Для того что бы понять, работает индек или нет, а так же как он вообще работает в консоле базы данных следует выполнить EXPLAIN ANALYZE, в Вашем случае:
EXPLAIN ANALYZE SELECT * FROM b WHERE a_id='123' ORDER BY time DESC;

2. Скорее всего в Вашем случае скорость запроса зависит не сколько от работы индекса, сколько от количества записей возвращаемых запросом для разных a_id. Почему нет LIMIT ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы