非阻塞优化 table

Non-blocking optimize table

我想使用非阻塞优化 table(我试过正常 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()

这看起来是个好方法吗,或者我是否缺少/可以改进的地方?

[问题:如何在标记中指定代码语言?]

有缺陷。

  • 它本质上是在做 OPTIMIZE 所做的事情——复制 table 并重建索引。
  • 您正在优化两次 - 一次是 CREATE .. SELECT,然后是 OPTIMIZE
  • 优化期间的任何写入都将丢失。
  • 在单个 RENAME 语句中执行所有 RENAMEs 以避免 table 不存在的短暂时间:RENAME TABLE real TO old, new TO real;

所有这些都说您的优化脚本不如内置脚本好。

pt-online-schema-change,但不进行实际的架构更改,是一款性能更好的免费工具。

无论如何,你为什么要使用 OPTIMIZE?它几乎从来没有足够的用途来保证这样做。难道只是重建一个InnoDB FULLTEXT索引?请记住,OPTIMIZE 复制 table 并重建所有索引。

MySQL 8.0,我认为,有一个 'in-place' 优化。升级得到这个。

同时,考虑停止读取和写入,DROP INDEXADD INDEX 用于一个 FULLTEXT 索引。