我是一名应用统计学家,不熟悉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列中的所有值进行比较。 ,保持并返回最大值,并将其返回。
答案 0 :(得分:1)
我很惊讶,没有人问......你是否在查询时间戳列上有索引?它应该是瞬间的...但是不要只为索引构建索引,索引应该基于更常见的查询条件,但如果基于统计信息,并且您正在根据事情发生的时间执行此操作和其他查询,一个指数肯定会有所帮助。此外,数据行有多大,可能有哪些其他列可能正在运行查询......这可能有助于构建复合索引(多字段索引)以帮助
答案 1 :(得分:1)
半解决方案(或者,我是如何解决的)
每个人的建议都是预先确定的。
我运行查询的列未编入索引。如此多的行(数十亿),即使是快速的机器也需要一两天才能运行简单的查询。现在,向此列添加索引(花费十个小时)意味着查询时间需要几秒或几分之一秒。
键入mySQL变量进行调整:wait_timeout
,max_allowed_packet
以解决“MySQL服务器已消失”消息。
我对innodb_buffer_pool_size
的问题似乎是一个幻影,与我的主要问题无关。
感谢您的帮助user2196728和DRapp