【原创】解决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的方法如下:
这样安装是最快且最稳妥的。