具有大量记录的MySQL查询被终止

Man*_*noi 13 mysql command-line-interface

我从我的shell运行以下查询:

    mysql -h my-host.net -u myuser -p -e "SELECT component_id, parent_component_id FROM myschema.components comp INNER JOIN my_second_schema.component_parents related_comp ON comp.id = related_comp.component_id ORDER BY component_id;" > /tmp/IT_component_parents.txt
Run Code Online (Sandbox Code Playgroud)

查询运行时间很长,然后获取KILLED.

但是,如果我添加LIMIT 1000,则查询将一直运行到结束,输出将写入文件中.

我进一步调查并发现(使用COUNT(*)),将返回的记录总数为239553163.

有关我的服务器的一些信息在这里:

MySQL 5.5.27

    +----------------------------+----------+
    | Variable_name              | Value    |
    +----------------------------+----------+
    | connect_timeout            | 10       |
    | delayed_insert_timeout     | 300      |
    | innodb_lock_wait_timeout   | 50       |
    | innodb_rollback_on_timeout | OFF      |
    | interactive_timeout        | 28800    |
    | lock_wait_timeout          | 31536000 |
    | net_read_timeout           | 30       |
    | net_write_timeout          | 60       |
    | slave_net_timeout          | 3600     |
    | wait_timeout               | 28800    |
    +----------------------------+----------+
Run Code Online (Sandbox Code Playgroud)

这是我监控的查询的状态:

    copying to tmp table on disk
    sorting results
    sending data
    writing to net
    sending data
    writing to net
    sending data
    writing to net
    sending data ...
    KILLED
Run Code Online (Sandbox Code Playgroud)

有没有猜到这里有什么问题?

小智 18

mysql客户端可能内存不足.

使用--quick选项不将结果缓冲到内存中.


Ran*_*eed 1

错误的是您返回了 239 553 163 行数据!不要感到惊讶,它需要很多时间来处理。实际上,最长的部分很可能是将结果集发送回您的客户端。

减少结果集(您真的需要所有这些行吗?)。或者尝试以较小的批量输出数据:

mysql -h my-host.net -u myuser -p -e "SELECT ... LIMIT 10000, 0" >> dump.txt
mysql -h my-host.net -u myuser -p -e "SELECT ... LIMIT 10000, 10000" >> dump.txt
Run Code Online (Sandbox Code Playgroud)