【问题标题】:Non-blocking optimize table非阻塞优化表
【发布时间】:2020-01-18 00:44:35
【问题描述】:

我想使用一个非阻塞优化表(我已经尝试过正常的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()

这似乎是一个好方法,还是我缺少/可以改进的地方?

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

【问题讨论】:

  • 如果表有并发更新,这些将会丢失(你需要在之后以某种方式重新应用它们)。如果表没有并发更新,那么直接在表上正常优化真的有问题吗?
  • @Thilo -- 是的,我宁愿在运行时重新运行更新(我们存储了一个日志,这样就不会成为问题)。
  • 您使用的是什么存储引擎?文档声称 InnoDB 的优化是在线完成的。
  • InnoDB -- 它是重建一个 fts 索引,除非我在对搜索相关的内容进行重大更新时运行它,否则它会严重退化。

标签: mysql sql nonblocking


【解决方案1】:

这是有缺陷的。

  • 它本质上与OPTIMIZE 所做的一样——复制表并重建索引。
  • 您正在优化两次 - 一次使用 CREATE .. SELECT,然后再次使用 OPTIMIZE
  • 优化期间的所有写入都将丢失。
  • 在单个RENAME 语句中执行所有RENAMEs 以避免在没有表时出现短暂的时间:RENAME TABLE real TO old, new TO real;

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

pt-online-schema-change,但不做实际的架构更改,是一个做得更好的免费工具。

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

我认为,MySQL 8.0 有一个“就地”优化。升级以获得这个。

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

【讨论】:

  • 很棒的答案,谢谢。是的,这是针对FULLTEXT 索引的——您的回答中有两个问题:(1)我如何在单个语句中进行多次重命名? (2) 优化对 ft 索引有什么作用?为什么 ft 索引本身不能“保持优化”?
  • @David542 - 我更新了一个重命名示例。我假设 FT 指数只是简单地重建。我还没有听到为什么它不能保持优化。 (非 FT 索引在这方面做得很合理。)
猜你喜欢
  • 2016-11-06
  • 2018-11-15
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多