MySQL大限制数量与无限制

时间:2017-12-14 07:55:18

标签: mysql optimization

我想知道什么会更快,以及使用一个或另一个查询的权衡是什么?

SELECT * FROM table WHERE somecolumn = 'something' LIMIT 999;

VS

SELECT * FROM table WHERE somecolumn = 'something';

现在,考虑到查询结果永远不会返回超过几百行,使用LIMIT 999是否会对性能产生重大影响?

我正在调查此选项,因为在我的项目中,我会为用户提供某种选项来限制他喜欢的结果,并且他可以将限制为空以显示所有内容,因此它&# 39;我更容易离开LIMIT部分查询,然后只是更改数字。

现在,表格非常大,从数十万到数千万行不等。 确切的问题看起来像:

SELECT  SUM(revenue) AS cost,
        IF(ISNULL(headline) OR  headline = '', 'undefined', headline
           ) AS headline
    FROM  `some_table`
    WHERE  ((date >= '2017-01-01')
       AND  (date <= '2017-12-31')
           )
      AND          -- (sic)
    GROUP BY  `headline`
    ORDER BY  `cost` DESC 

正如我之前所说,这个查询永远不会返回超过一百行。

1 个答案:

答案 0 :(得分:1)

  • 磁盘I / O(如果有)是目前查询中成本最高的部分。
  • 获取每一行的排名。
  • 几乎所有其他东西都是无足轻重的。

但是,如果 LIMIT的存在可以更改优化程序的功能,那么然后可能会有显着差异。

  • 在大多数情况下,包括您提供的查询,过大的LIMIT都没有影响。
  • 某些子查询中,LIMIT会阻止ORDER BY的消除。根据定义,子查询是一个不是有序集的集合。因此,LIMIT是阻止优化移除ORDER BY
  • 的一个障碍
  • 如果有一个复合索引,其中包含WHEREGROUP BY ORDER BY所需的所有列,则达到LIMIT时,优化工具可以停止。对于GROUP BYORDER BY,其他情况会通过tmp表和排序,并且只能针对整个行执行LIMIT

到目前为止,评论中提到了两个缓存。

  • &#34;查询缓存&#34; - 这记录了确切的查询及其结果集。 如果 打开(如果适用),则查询会立即返回&#34;即时&#34;。通过&#34; exact&#34;,我包含了LIMIT
  • 的存在和价值
  • 为了加快所有查询,数据和索引块被缓存&#34;在RAM中(见innodb_buffer_pool_size)。当运行类似的(不一定是精确的)查询时,这可以避免磁盘I / O.见上面的第一句话。