美好的一天,朋友们。我在一台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那样在这些情况下崩溃。这是真的还是一个妻子的故事?
答案 0 :(得分:2)
排序1500M
IP地址不是最佳选择。
如果您想要500K
随机IP地址,请使用以下方法:
虽然它也不会太高效,因为它需要两次通过桌面。
您可以粗略估计COUNT(*)
而不是子查询。这样可以加快查询速度,但是会遗漏一些地址或获得的结果少于所需的结果。
答案 1 :(得分:1)
按rand()命令将导致带有filesort的临时表,我怀疑你的表崩溃是由于内存限制。您可以尝试调整conf文件,以允许mysql为临时表和排序缓冲区利用更多内存。