Запрос SQLAlchemy занимает слишком много времени

#python #mysql #performance #sqlalchemy

#python #mysql #Производительность #sqlalchemy

Вопрос:

ребята. Я получил запрос на SQLAlchemy, который занимает слишком много времени. Я не знаю, связано ли это с тем, что база данных слишком большая (6,5 миллионов строк, так что я так не думаю) или я делаю что-то не так. Ниже приведены таблицы.

 class A(Base):
    __tablename__ = 'tbl_a'

    id = Column(Integer, primary_key=True, autoincrement=True)
    
    a = Column(CHAR(3))
    b = Column(DATE)
    c = Column(Integer)
    d = Column(Integer)
    e = Column(Integer)
    

class B(Base):
    __tablename__ = 'tbl_b'

    id = Column(Integer, primary_key=True, autoincrement=True)
    a = Column(Integer)
    b  = Column(DATE)
    c  = Column(Integer)
    d  = Column(Integer)
 

И это запрос:

 row  = session.query(A).get(id)

value = session.query(B.d).filter((B.b == row.b)amp;
                                  (B.d == row.c)amp;
                                  (B.e == row.d)).first()

    
 

Только при одном условии B.b == row.b это занимает 2 минуты, при большем количестве я не видел, чтобы это заканчивалось через 10 минут. Получение значения занимает 0,5 секунды row . Одна вещь, которую я увидел, заключалась в том, что индексация столбцов, которые вы собираетесь использовать в предложении where, ускоряет процесс. Если да, могу ли я сделать это после того, как загрузил записи в свою базу данных?

Комментарии:

1. Да, индексы могут быть добавлены впоследствии. Однако изменения не будут видны в самой базе данных, если вы не примените миграцию или не добавите индексы самостоятельно. SQLAlchemy не будет автоматически добавлять их для вас. И да, отсутствие индексов является причиной того, что ваш запрос выполняется медленно. Индекс (b, d, e) для таблицы B, вероятно, приведет к ее разрешению менее чем за десятую долю секунды. Перегонный куб — это то, что обычно используется для миграции в SQLAlchemy: alembic.sqlalchemy.org/en/latest — вы можете добавить индексы вручную через консоль MySQL ( CREATE INDEX .. ): dev.mysql.com/doc/refman/8.0/en/create-index.html

2. Пожалуйста, предоставьте сгенерированный SQL.

3. @MatsLindh попал в точку. Но я смог изменить put b = Column(DATE,index=True) и то же самое для других столбцов, и теперь он работает нормально (6 секунд). Мне не нужно было ни мигрировать, ни делать что-либо еще.

4. @Rafael EXPLAIN ... перед запросом, который генерирует SQLAlchemy, также даст вам много информации о том, как вы можете оптимизировать свой запрос. Вы должны быть в состоянии сделать это быстрее, чем за шесть секунд (в зависимости от количества возвращаемых строк), но если это достаточно хорошо, то этого достаточно. 🙂