一个复杂的select  如果没有limit,直接结束, 查询过程中会导致 copy to tmp table
如果设置一个很大的limit 例如: limit 0, 100000  则直接输出结果
比不带limit 的语句要快很多, 我这里有个sql执行时间 40秒 对  16分钟的比例是不是哪里不对, 为什么出现这个现象? 高人给解答一下

解决方案 »

  1.   

    不太可能吧   explain出来的执行计划应该一样吧
      

  2.   

    不会吧,LIMIT应该要慢一些,取出所有记录后。再LIMIT
      

  3.   

    不太可能吧   explain出来的执行计划应该一样吧 楼主是如何得到这个结论的? 建议描述一下测试步骤 ------------------------------------
    命令行执行这个sql, 在另外的窗口 show processlist, 手动刷新
    有limit的sql看不到copy to tmp table
    没有limit的copy to tmp table好长时间
      

  4.   

    不会吧,LIMIT应该要慢一些,取出所有记录后。再LIMIT 我觉得也是这样, 但显示的结果不是, 所以上来问问
      

  5.   

    select 的结果4万多条   我limit 0, 50000  速度就快, 40秒左右(多次平均值)
    直接没有limit就需要16分钟, 这个只算了一次.
    另: 两个sql我都order了group的字段,力争速度的干扰做到最小
      

  6.   

    如果是mysql5.1以上版本可以尝试
    mysql> set profiling=1;
    Query OK, 0 rows affected (0.00 sec)mysql> select count(*) from foo;
    +----------+
    | count(*) |
    +----------+
    |        9 |
    +----------+
    1 row in set (0.00 sec)mysql> show profiles;
    +----------+------------+--------------------------+
    | Query_ID | Duration   | Query                    |
    +----------+------------+--------------------------+
    |        1 | 0.00021300 | select count(*) from foo |
    +----------+------------+--------------------------+
    1 row in set (0.00 sec)mysql> show profile for query 1;
    +--------------------+----------+
    | Status             | Duration |
    +--------------------+----------+
    | starting           | 0.000084 |
    | Opening tables     | 0.000020 |
    | System lock        | 0.000008 |
    | Table lock         | 0.000013 |
    | init               | 0.000020 |
    | optimizing         | 0.000010 |
    | executing          | 0.000019 |
    | end                | 0.000006 |
    | query end          | 0.000003 |
    | freeing items      | 0.000025 |
    | logging slow query | 0.000002 |
    | cleaning up        | 0.000003 |
    +--------------------+----------+
    12 rows in set (0.00 sec)mysql> show profile cpu,block io for query 1;
    +--------------------+----------+----------+------------+--------------+---------------+
    | Status             | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out |
    +--------------------+----------+----------+------------+--------------+---------------+
    | starting           | 0.000084 |     NULL |       NULL |         NULL |          NULL |
    | Opening tables     | 0.000020 |     NULL |       NULL |         NULL |          NULL |
    | System lock        | 0.000008 |     NULL |       NULL |         NULL |          NULL |
    | Table lock         | 0.000013 |     NULL |       NULL |         NULL |          NULL |
    | init               | 0.000020 |     NULL |       NULL |         NULL |          NULL |
    | optimizing         | 0.000010 |     NULL |       NULL |         NULL |          NULL |
    | executing          | 0.000019 |     NULL |       NULL |         NULL |          NULL |
    | end                | 0.000006 |     NULL |       NULL |         NULL |          NULL |
    | query end          | 0.000003 |     NULL |       NULL |         NULL |          NULL |
    | freeing items      | 0.000025 |     NULL |       NULL |         NULL |          NULL |
    | logging slow query | 0.000002 |     NULL |       NULL |         NULL |          NULL |
    | cleaning up        | 0.000003 |     NULL |       NULL |         NULL |          NULL |
    +--------------------+----------+----------+------------+--------------+---------------+
    12 rows in set (0.00 sec)mysql>