所以我试图找出关于MySQL和排序行功能的一些优化。据我所知,你可以设置一个最大行比较,如果你的机器内存可以减少I / O,最好将它设置得相当高。我的问题是,当您加载更多东西进行排序或静态作为大块时,内存是否会动态分配?基本上,如果我确定100%肯定我将永远不会说超过1000行进行排序,设置最大行数1200更高效,为了以防万一,给出一个小缓冲区,而不是100万。感谢您的回答,如果我不够明确,我仍然对SQL和MySQL不熟悉。
答案 0 :(得分:0)
当MySQL需要对结果集进行排序时,例如为了满足SELECT ... ORDER BY
,它将采用以下几种方式之一:
如果ORDER BY
可以处理INDEX
,则无需排序。
如果行数是“小”' (以及其他一些标准),它将在RAM中创建一个MEMORY
表,并使用内存中的排序来完成工作。这非常快。此类temp-MEMORY表受tmp_table_size
和max_heap_table_size
的限制。由于多个连接可能同时执行此操作,因此最好不要将其设置为高于1%的RAM。
如果溢出或以其他方式失败,则构建MyISAM表。这可以具有基本上无限的大小。但是,由于缓存,它可能会或可能不会溢出到磁盘,从而产生I / O.
在其他情况下,MySQL会对事物进行排序。例如,创建索引可以收集所有信息,对其进行排序,然后将信息喷射到索引的BTree中。这可能涉及操作系统排序,同样可能涉及或不涉及I / O.
1200行可能在RAM中完成; 1M行可能涉及I / O.
但是,最重要的是:不要担心它。如果您需要ORDER BY
,请使用它。让MySQL以最好的方式做到这一点。