#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.html2. Пожалуйста, предоставьте сгенерированный SQL.
3. @MatsLindh попал в точку. Но я смог изменить put
b = Column(DATE,index=True)
и то же самое для других столбцов, и теперь он работает нормально (6 секунд). Мне не нужно было ни мигрировать, ни делать что-либо еще.4. @Rafael
EXPLAIN ...
перед запросом, который генерирует SQLAlchemy, также даст вам много информации о том, как вы можете оптимизировать свой запрос. Вы должны быть в состоянии сделать это быстрее, чем за шесть секунд (в зависимости от количества возвращаемых строк), но если это достаточно хорошо, то этого достаточно. 🙂