【问题标题】:Order by RAND( ) on a HUGE table causes it to crash in MySQL. Why?在一个巨大的表上按 RAND() 排序会导致它在 MySQL 中崩溃。为什么?
【发布时间】:2010-11-09 15:16:09
【问题描述】:

朋友们,美好的一天。我在 32b 机器上运行 Fedora 13。

我有一个巨大的 1.5B ip 地址表(当我有资源时会分开,别担心;))。当我运行这个查询时:

SELECT ip FROM ips ORDER BY RAND() LIMIT 500000;

有时表崩溃(我收到错误“MySQL 表被标记为崩溃并且应该修复”),有时它不会。我的问题是;什么样的事情会导致 MyISAM 或 InnoDB 表崩溃?记忆有影响吗?因为我的系统监视器显示它只使用了大约 30%。

这里是 my.cnf(默认,从元包安装):

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

还有;我听说 PostGreSQL “更健壮”并且不会像 MySQL 在这些情况下那样崩溃。这是真的还是妻子的故事?

【问题讨论】:

  • 你能更准确地定义“崩溃”吗?查询是根本没有返回,还是您收到错误消息,还是整个机器都挂了或...
  • 我在交互式终端中运行查询时收到错误“MySQL 表已标记为崩溃并应修复”。
  • 更改标题。接受的答案和其他答案与标题无关!

标签: mysql crash innodb myisam


【解决方案1】:

对 IP 地址的1500M 进行排序并不是最好的办法。

如果您想要500K 随机IP 地址,请使用这种方法:

不过,它也不会太高效,因为它需要在桌子上两次通过。

您可以粗略估计COUNT(*) 而不是子查询。这将加快查询速度,但可能会丢失一些地址或获得比需要更少的结果。

【讨论】:

  • 这是一个很棒的提示!我喜欢它。
  • 这不是上面问题的答案!!
【解决方案2】:

按 rand() 排序将导致带有文件排序的临时表,我怀疑您的表崩溃是由于内存限制。您可以尝试调整您的 conf 文件以允许 mysql 将更多内存用于临时表和排序缓冲区。

【讨论】:

  • 这个答案很有用,但我的硬盘是 3TB(其中 2.5 是免费的)所以我很确定这不是我的问题(同样,RAM 使用率约为 30% )。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多