对于某个项目,命令似乎use <database>;
花费了非常长的时间(通常是一分钟或更长时间)。(这似乎是不同版本的 MySQL(我认为是 5.3 和 5.5)上的几个不同实例的情况)。我知道这是由Tab完整的功能引起的,我知道我可以只使用 -A 标志,但我对这种延迟的原因很感兴趣。
我的第一个猜测是,这与 的速度有关INFORMATION_SCHEMA
,并且列的绝对数量导致了延迟,但是在 4.7k 列(580 个表,每个表约 8 列)下,这似乎有点牵强。有 3.6k 个索引,但我认为这不是问题的可能原因。
你几乎一针见血。
如果该
use
命令导致默认数据库发生更改,则 MySQL 客户端分支到build_completion_hash()
.如果客户端未使用
-A
选项启动,则该功能:散列所有 SQL 命令;
执行
show databases
并散列结果;执行
show tables
并散列结果;和对于每个表,调用
mysql_list_fields()
并散列结果。因此,在您的情况下,它发出582 个单独的数据库请求(第 2 步和第 3 步各一个;第 4 步 580 个),循环每个请求的结果。哎哟。
当然,做(或至少第一次尝试做)一个人会更明智,
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
但我们不会去思考为什么……我能想到的有几种可能性:
加载自动完成数据需要很长时间,因为您有一个包含大量表和列的架构。传输此信息并不总是非常有效,因此正如您所注意到的,-A 可能会有所帮助。连接到主
mysql
数据库很慢吗?否则,MySQL 可能处于静止状态,需要一些时间来启动并为您的请求做好准备,尽管这应该意味着第二个连接要快得多。一旦缓存(包括操作系统级别的磁盘缓存)预热,它的性能应该会更好。在负载较轻的系统上,通常会出现这种情况。