代码之家  ›  专栏  ›  技术社区  ›  KeatsKelleher

按rand()在一个大表上排序会导致它在mysql中崩溃。为什么?

  •  1
  • KeatsKelleher  · 技术社区  · 14 年前

    你好,朋友们。我在32B机器上运行Fedora13。

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

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

    有时表崩溃(我得到错误“mysql table被标记为崩溃,应该修复”),有时不,我的问题是:什么样的东西导致myisam或innodb表崩溃?记忆有影响吗?因为我的系统监视器显示它只使用大约30%。

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

    [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 回复  |  直到 13 年前
        1
  •  2
  •   Quassnoi    14 年前

    排序 1500M IP地址的数量不是最好的主意。

    如果你想的话 500K 随机IP地址,使用此方法:

    不过,它的效率也不会太高,因为它需要两次通过。

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

        2
  •  1
  •   superfro    14 年前

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