> 文章列表 > 【原创】解决MySQL表信息schema更新不及时的问题,包括auto_increment值和表行数更新不及时

【原创】解决MySQL表信息schema更新不及时的问题,包括auto_increment值和表行数更新不及时

【原创】解决MySQL表信息schema更新不及时的问题,包括auto_increment值和表行数更新不及时

前言

由于数据库要做一个模板库,用于安装包中,因此需要删除那些不需要的数据,只保留一些配置方面的数据,因此要重做auto_increment,还要清空一堆表的数据,但是我发现设置auto_increment和截断表后DBeaver中的auto_increment还是原来的值,数据量也是原来的值,怎么刷新都没用,这就让我十分恼火了,还以为是DBeaver故意搞事情不更新。结果查了一堆资料后发现原来是MySQL自己的问题,innodb不会立即将表信息保存到MySQL的information_schema表中,因此导致在DBeaver即使设置了auto_increment,刷新一下还会还原。

 按一下F5后

实则是修改成功的,但是刷新完就还原了,搞得我无法得知这个表是否真的被清空数据,且auto_increment被还原了 

初步解决

我看了很多文章说的是修改MySQL的Global settings,但是这个会严重影响MySQL的执行效率,而且我试了一下,也不行,比如说:

SET GLOBAL innodb_stats_on_metadata=on;

上述语句执行后并没有什么用。

然后还有一句是

ANALYZE TABLE {表名};

这个确实有用,但是每次只能刷新一张表,我改了上百张表,得手动执行100多次,而且每次表名还不同,这谁受得了!因此必须要找一个更好的解决方案。

最后我选择了Python

最终解决

使用Python刷新所有,代码如下:

import pymysqlconnection = pymysql.Connection(host="127.0.0.1",port=3306,user="root",password='123456'
)cursor = connection.cursor()
connection.select_db("test_db")
result = cursor.execute("show tables")
allTables: tuple = cursor.allTables()for table in allTables:tableName = table[0]print(f"table name is {tableName} start analyze")cursor.execute(f"ANALYZE TABLE {tableName}")

使用pymysql让python连接到自己的数据库,然后查询出所有的表,循环执行ANALYZE TABLE即可。

不得不说Python写这玩意行数是真少,且执行最为方便。

附录

安装pymysql的方法如下:

这样安装是最快且最稳妥的。