非阻塞优化 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 INDEX
和 ADD INDEX
用于一个 FULLTEXT
索引。
我想使用非阻塞优化 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 INDEX
和 ADD INDEX
用于一个 FULLTEXT
索引。