上千张数据表时,MySQL use 数据库名需要等待几分钟
今天在使用 mysql 命令行访问一个远程的数据库时,发现对于一个有上千张表的数据库,执行:
use database_name;
需要等待几分钟。最近接触的几个 MES 系统和 CRM 系统,没想到都是 1000 多个表以上,甚至是 1500 张表,而且不是日期水平分表造成的,太恐怖了😱
耗时的原因
MySQL 客户端的一个默认行为:为了让你能使用 Tab 键自动补全表名和列名,客户端在切换数据库时会预读整个数据库的所有元数据(Metadata)。对于拥有 1000 张表的数据库,这个预读过程会产生巨大的网络传输和服务器查询开销,从而导致长时间卡顿。
解决方案一
在连接 MySQL 的命令行中加上 -A 参数(或完整写法 –skip-auto-rehash),就可以告诉客户端:在执行 USE 命令时,不要自动补全和预读数据库信息。
连接命令示例:
mysql -h 你的远程主机IP -u 用户名 -p -A
权衡:使用此参数后,你将失去 Tab 键自动补全表名和列名的便利。你需要完整地手动输入表名。对于表数量极多的场景,用这点便利换取数分钟的等待时间,通常是值得的。
看了一下 mysql 的参数说明,确实有这个参数:
> man mysql
--no-auto-rehash, -A
This has the same effect as --skip-auto-rehash.
Use --disable-auto-rehash to disable rehashing. That causes mysql to start faster, but you must issue the rehash command or its \# shortcut if you want to use name completion.
解决方案二
mysql 命令行,是否可以 不使用 use xxx; 就能直接查询数据库中的某个表的数据?
确实可以:
SELECT * FROM 数据库名.表名;
我感觉第一种方案比较好一点,可以省去每次输入数据库名的麻烦。
评论
?
参与讨论