Неблокирующая таблица оптимизации - PullRequest
1 голос
/ 18 января 2020

Я хотел бы использовать неблокирующую таблицу оптимизации (я пытался сделать обычный OPTIMIZE, и я заметил около 2 минут простоя. Вот код, который у меня сейчас есть для этого:

@staticmethod
def optimize_table_nonblocking(tablename='eidrdedupe_test'):
    conn, cursor = get_new_db_conn_and_cursor()

    # populate a (potentially previously-existing) table with the data
    cursor.execute('DROP TABLE IF EXISTS %s_tmp' % tablename)
    cursor.execute("CREATE TABLE %s_tmp SELECT * FROM %s" % (tablename, tablename))

    # optimize that table
    cursor.execute("OPTIMIZE TABLE %s_tmp" % tablename)
    conn.commit()

    # swap the tables // keep the old table so we can examine it if we want
    cursor.execute('RENAME TABLE %s TO %s_tmp1' % (tablename, tablename))       # rename current table to _tmp1
    cursor.execute('RENAME TABLE %s_tmp TO %s' % (tablename, tablename))        # rename tmp table to main table
    cursor.execute('RENAME TABLE %s_tmp1 TO %s_tmp' % (tablename, tablename))   # now previous table is _tmp
    conn.commit()

    cursor.close(); conn.close()

Кажется ли это хорошим подходом, или есть вещи, которые я упускаю / могу улучшить?

[ Вопрос : Как указать язык кода в разметке?]

1 Ответ

2 голосов
/ 18 января 2020

Имеет fl aws.

  • Он делает то, что делает OPTIMIZE - копирует таблицу и перестраивает индексы.
  • Вы оптимизируете дважды - - один раз с CREATE .. SELECT, затем снова с OPTIMIZE.
  • Все записи во время оптимизации будут потеряны.
  • Выполните все RENAMEs в одном выражении RENAME чтобы избежать короткого времени, когда таблицы не существует: RENAME TABLE real TO old, new TO real;

Все они говорят, что ваш скрипт оптимизации не может быть таким же хорошим, как встроенный.

pt-online-schema-change, но не делать никаких реальных изменений схемы, это бесплатный инструмент, который работает лучше.

В любом случае, почему вы используете OPTIMIZE? Это почти никогда не достаточно полезно, чтобы оправдать это. Это просто перестроить индекс InnoDB FULLTEXT? Имейте в виду, что OPTIMIZE копирует таблицу и перестраивает все индексы.

MySQL 8.0, я думаю, имеет оптимизацию «на месте». Обновление, чтобы получить это.

Тем временем, подумайте об остановке операций чтения и записи, DROP INDEX и ADD INDEX для одного FULLTEXT индекса.

...