上千张数据表时,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 数据库名.表名;
    

    我感觉第一种方案比较好一点,可以省去每次输入数据库名的麻烦。