【问题标题】:MySQL regarding Sort Size and efficiencyMySQL 关于排序大小和效率
【发布时间】:2016-06-25 10:51:15
【问题描述】:

所以我正在尝试对 MySQL 和排序行功能进行一些优化。据我了解,您可以设置最大行比较,如果您的机器内存可以使用它来减少 I/O,那么将其设置得相当高是个好主意。我的问题是,当您加载更多要排序的东西时,内存是动态分配的,还是作为一个大块静态分配的?基本上,如果我 100% 确定我永远不会有超过 1000 行来排序,那么将最大行数设置为 1200 行会更有效,以防万一,而不是 100 万行。感谢您的回答,如果我不够明确,我很抱歉,我对 SQL 和 MySQL 还是很陌生。

【问题讨论】:

    标签: mysql sql sorting optimization


    【解决方案1】:

    当 MySQL 需要对结果集进行排序时,例如满足 SELECT ... ORDER BY,它将以以下几种方式之一进行操作:

    1. 如果ORDER BY 可以由INDEX 处理,则不需要排序。

    2. 如果行数是“小”(以及其他一些标准),它将在 RAM 中创建一个MEMORY 表并使用内存中的排序来完成这项工作。这是非常快的。此类 temp-MEMORY 表受tmp_table_sizemax_heap_table_size 的限制。由于多个连接可能同时执行此操作,因此最好不要将其设置为高于 RAM 的 1%。

    3. 如果溢出或失败,则改为构建 MyISAM 表。这可以具有基本上无限的大小。尽管如此,由于缓存,它可能会或可能不会溢出到磁盘,从而导致 I/O。

    在其他情况下,MySQL 会对事物进行排序。例如,创建索引可能会收集所有信息,对其进行排序,然后将信息发送到索引的 BTree 中。这可能涉及操作系统排序,同样,它可能涉及也可能不涉及 I/O。

    1200 行可能在 RAM 中完成; 1M 行可能涉及 I/O。

    但是,底线是:不要担心。如果您需要ORDER BY,请使用它。让 MySQL 尽其所能。

    【讨论】:

      猜你喜欢
      • 2011-10-16
      • 2012-04-12
      • 2011-02-10
      • 2013-01-12
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 1970-01-01
      • 2018-06-28
      相关资源
      最近更新 更多