【发布时间】:2011-11-14 00:35:21
【问题描述】:
如果 MySQL 要在超过 1000 万行的表上运行查询 select * from table order by datetime,其中 datetime 是日期时间列,它使用哪种排序算法?
【问题讨论】:
如果 MySQL 要在超过 1000 万行的表上运行查询 select * from table order by datetime,其中 datetime 是日期时间列,它使用哪种排序算法?
【问题讨论】:
您可以在Order By Optimisation 的文档中找到详细信息。
基本上MySQL引擎会考虑使用索引,如果有合适的可用,估计使用它对性能有好处。
如果没有选择这样的索引,则将执行所谓的“文件排序”操作,尽管它的名字很可能完全在内存中执行。但它也可能使用临时文件来换入/换出(待)排序的分区,并将已排序的分区合并为更大的分区。
使用快速排序执行内存中排序。您可以在the source files in the mysys folder 中找到mf_qsort.c 文件。
datetime 由 5 to 8 bytes 表示(取决于是否使用第二个小数),按它排序与对 bigint 排序没有什么不同,occupies 8 bytes。
【讨论】:
如果您的列日期时间已声明索引,则它可以工作。如果没有索引,您的查询将在数百万条记录上变慢。如果您单独使用它进行报告,应该没问题。
在一般用法(与许多用户的快速交互)中,这不是一个好习惯。建议在 WHERE 子句上使用附加条件来进一步过滤您的数据。以及在 WHERE 子句中使用的列上具有附加索引。 LIMIT 子句也有帮助。
【讨论】: