我有一张包含3800万行条目的表格。为了更快地进行最终查询,我想在某些列上创建索引。
在一列上创建索引时,它运行大约2小时,然后显示:
Lost connection to MySQL server during query
但是,如果我重新启动我正在处理的mySql工作台,它会在那里显示我的新索引。我有两个问题:
1)创建的新索引是完整索引还是不完整/无效索引?
2)如何解决丢失的连接问题? 从编辑>首选项> SQL编辑器:我已将DBMS连接读取超时和其他2个值更改为较大值。但这并没有帮助。
答案 0 :(得分:3)
索引创建是一种原子操作,从某种意义上说它将完全成功或完全失败...所以如果你有一个索引,它将完整无缺并完整。
您丢失连接的原因很可能是网络 - 至少一台设备(例如防火墙或NAT路由器,或者如果这是基于云的服务器,它可能是云提供商的设备)您和服务器之间的网络路径中的基础结构维护活动TCP会话的TCP流状态表,并且在一段时间内没有数据传输,连接将从该设备的内存中清除,因此连接崩溃。
MySQL客户端/服务器协议没有第7层保持活动机制来保持网络上的空闲连接...从网络的角度来看,在索引创建操作期间连接完全空闲。
有可能在客户端和/或服务器上更改内核级参数,以便在第4层附近交换一些保持活动的消息,使连接保持较低级别,但这是系统特定的({{ 3}})。
通常,通过仅在连接上禁用外键检查,同时添加索引,还可以大大加快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 ...;
这些选项通过避免不必要的锁定以及将索引附加到表中而不是复制表来加速索引操作。如果服务器不喜欢您正在执行的特定操作的这些选项,它会告诉您错误,并且不会造成任何伤害。 ALGORITHM
和LOCK
选项有时需要先禁用外键检查,并在完成后启用它们。
值得重复:如上所示关闭外键检查只会影响一个连接 - 您的 - 而不是任何其他连接。如果从其他用户访问该表,或者甚至是您从另一个连接访问同一个表,则不会禁用对要更改的表的检查。只要在禁用外键引用时不执行任何操作,此设置不会危害数据完整性。这是一个众所周知且常用的优化。在添加索引时不需要检查,但服务器在某些情况下会尝试不必要地验证现有数据。