在一个巨大的表上由RAND()命令导致它在MySQL中崩溃。为什么?

时间:2010-11-09 15:16:09

标签: mysql crash innodb myisam

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

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

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

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

这是my.cnf(默认情况下,从meta-package安装):

[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那样在这些情况下崩溃。这是真的还是一个妻子的故事?

2 个答案:

答案 0 :(得分:2)

排序1500M IP地址不是最佳选择。

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

虽然它也不会太高效,因为它需要两次通过桌面。

您可以粗略估计COUNT(*)而不是子查询。这样可以加快查询速度,但是会遗漏一些地址或获得的结果少于所需的结果。

答案 1 :(得分:1)

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