查询期间在创建索引时丢失了与mysql服务器的连接,但之后仍然获取索引

问题描述 投票:1回答:1

我有一个包含3800万行条目的表。为了使最终查询更快,我想在一些列上创建索引。

在一列上创建索引时,它运行大约2小时,然后显示:

Lost connection to MySQL server during query

但是,如果我重新启动我正在处理的mySql工作台,它会在那里显示我的新索引。我有两个问题:

1)创建的新索引是完整索引还是不完整索引?

2)如何解决丢失的连接问题?从编辑>首选项> SQL编辑器:我已将DBMS连接读取超时和其他2个值更改为较大值。但这没有用。

mysql indexing mysql-workbench
1个回答
3
投票

索引创建是一种原子操作,在某种意义上它将完全成功或完全失败...所以如果你有一个索引,它将完整无缺。

您丢失连接的原因很可能是网络 - 至少一个设备(例如防火墙或NAT路由器,或者如果这是基于云的服务器,它可能是云提供商的基础设施中的设备)您和服务器之间的网络路径维护活动TCP会话的TCP流状态表,并且在一段时间内没有传输数据,连接将从该设备的内存中清除,因此连接会崩溃。

MySQL客户端/服务器协议没有第7层保持活动机制来保持网络上的空闲连接...并且从网络的角度来看,在索引创建操作期间连接完全空闲。

可以在客户端和/或服务器上更改内核级参数,以便在第4层附近交换一些保持活动的消息,使连接保持较低级别,但这是系统特定的(Linux example)。

通常,通过仅在连接上禁用外键检查,同时添加索引,还可以大大加快MySQL的索引创建速度。除非您完全确定索引操作不会危害任何数据完整性(即,除非您不添加外键,否则不要使用此操作),否则请勿执行此操作。

mysql> SET @@FOREIGN_KEY_CHECKS = 0;
mysql> ALTER TABLE ADD KEY ...;
mysql> SET @@FOREIGN_KEY_CHECKS = 1;

另请注意,如果您使用Workbench中的GUI来添加索引而不是实际键入SQL语句来更改表...请不要这样做。使用DDL的图形工具增加了浪费时间的可能性,因为它们有时会生成完成您预期目的的语句,但是以非常低效且有时不合逻辑的方式执行。

在许多情况下,您也可以使用此:

mysql> ALTER TABLE ALGORITHM=INPLACE, LOCK=NONE, ADD KEY ...;

这些选项通过避免不必要的锁定以及将索引附加到表中而不是复制表来加速索引操作。如果服务器不喜欢您正在执行的特定操作的这些选项,它会告诉您错误,并且不会造成任何伤害。 ALGORITHMLOCK选项有时需要先禁用外键检查,并在完成后启用它们。

值得重复:如上所示,关闭外键检查只会影响一个连接 - 您的 - 而不是任何其他连接。如果从其他用户访问该表,或者甚至是您从另一个连接访问同一个表,则不会禁用对要更改的表的检查。只要在禁用外键引用时不执行任何操作,此设置不会危害数据完整性。这是一个众所周知且常用的优化。在添加索引时不需要检查,但服务器在某些情况下会尝试不必要地验证现有数据。

© www.soinside.com 2019 - 2024. All rights reserved.