大型表上的orderbyrand()导致它在MySQL中崩溃。为什么?

大型表上的orderbyrand()导致它在MySQL中崩溃。为什么?,mysql,crash,innodb,myisam,Mysql,Crash,Innodb,Myisam,朋友们,你好。我在32b机器上运行Fedora 13 我有一个庞大的15亿ip地址表(不用担心,当我有资源时,这些地址将被拆分)。运行此查询时: SELECT ip FROM ips ORDER BY RAND() LIMIT 500000; 有时表崩溃(我得到错误“MySQL表被标记为崩溃,应该修复”),有时则没有。我的问题是,;什么样的事情导致MyISAM或InnoDB表崩溃?记忆有影响吗?因为我的系统监视器显示它只使用了大约30% 以下是my.cnf(默认值,从元软件包安装): 还有,;

朋友们,你好。我在32b机器上运行Fedora 13

我有一个庞大的15亿ip地址表(不用担心,当我有资源时,这些地址将被拆分)。运行此查询时:

SELECT ip FROM ips ORDER BY RAND() LIMIT 500000;
有时表崩溃(我得到错误“MySQL表被标记为崩溃,应该修复”),有时则没有。我的问题是,;什么样的事情导致MyISAM或InnoDB表崩溃?记忆有影响吗?因为我的系统监视器显示它只使用了大约30%

以下是my.cnf(默认值,从元软件包安装):


还有,;我听说PostGreSQL“更健壮”,在这些情况下不会像MySQL那样崩溃。这是真的还是假的?

对IP地址进行排序
1500M
不是最好的主意

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

不过,这也不会太有效率,因为它需要两次传球


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

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

这是一个很好的技巧!我喜欢。这不是上面问题的答案!!你能更准确地定义“崩溃”吗?是查询没有返回,还是您收到了错误消息,或者是整个机器都挂断了,或者……当我在交互终端中运行查询时,出现了错误“MySQL表被标记为已崩溃,应该修复”。请更改标题。被接受的答案和另一个答案与标题无关!这个答案很有用,但我的硬盘是3TB(其中2.5是免费的),所以我很确定这不是我的问题(同样,RAM使用率约为30%)。
[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