简单的mySQL查询大表结果“MySQL服务器已经消失”消息

时间:2013-12-02 22:09:56

标签: mysql sql

我是一名应用统计学家,不熟悉mySQL,希望得到您的建议。

错误: 在大型mySQL表(超过20亿行)上运行相对简单的查询(SELECT MAX(Timestamp) FROM Database.Table;)时,服务器运行大约十分钟并显示错误:

错误讯息文字:

在R:

08S01 2013 [MySQL][ODBC 5.2(a) Driver][mysqld-5.5.32-31.0]Lost connection to MySQL server during query
[RODBC] ERROR: Could not SQLExecDirect 'SELECT MAX(Timestamp) FROM Database.Table;'

在mySQL Workbench中:

Error Code: 2013. Lost connection to MySQL server during query  
Duration: 600.495 sec

可能的潜在客户: 在监视服务器状态时,查询似乎“放弃”并在InnoDB缓冲区使用率达到100%时返回错误。但是innodb_buffer_pool_size已设置为其最大值(约76 GB)。我得到了与这个特定表做任何事情相同的结果(查询min,尝试添加索引等)。

我已经通过RStudioServer运行查询了这个结果(首先可能不是一个好主意)并通过mySQL Workbench。我可以在相同结构的较小数据库表(大约7亿行和其他较小的)上运行查询而不会出现问题。

为什么会发生此错误有点令人困惑,因为像Find Max这样的查询根本不应该将大量数据加载到内存中 - 它应该只通过DatabaseSable的TimeStamp列中的所有值进行比较。 ,保持并返回最大值,并将其返回。

2 个答案:

答案 0 :(得分:1)

我很惊讶,没有人问......你是否在查询时间戳列上有索引?它应该是瞬间的...但是不要只为索引构建索引,索引应该基于更常见的查询条件,但如果基于统计信息,并且您正在根据事情发生的时间执行此操作和其他查询,一个指数肯定会有所帮助。此外,数据行有多大,可能有哪些其他列可能正在运行查询......这可能有助于构建复合索引(多字段索引)以帮助

答案 1 :(得分:1)

半解决方案(或者,我是如何解决的)

每个人的建议都是预先确定的。

我运行查询的列未编入索引。如此多的行(数十亿),即使是快速的机器也需要一两天才能运行简单的查询。现在,向此列添加索引(花费十个小时)意味着查询时间需要几秒或几分之一秒。

键入mySQL变量进行调整:wait_timeoutmax_allowed_packet以解决“MySQL服务器已消失”消息。

我对innodb_buffer_pool_size的问题似乎是一个幻影,与我的主要问题无关。

感谢您的帮助user2196728和DRapp