order by子句在使用时间戳时如何工作?

时间:2016-01-23 05:18:23

标签: mysql

我有一张桌子" tab1"它有一个时间戳字段" time1"。假设该表有100万条记录。我有以下两个测试查询:

  1. select * from tab1 order by time1 desc limit 0,10
  2. select * from tab1 order by time1 asc limit 0,10
  3. 当我们使用时间戳时,是否按照时间戳的排序顺序存储在数据库中的记录,还是在使用order by子句时必须在显示结果集之前对它们进行排序?

    如果排序完成,那么查询1和查询2中哪一个更快?

4 个答案:

答案 0 :(得分:1)

这取决于存储引擎/表类型的类型。 MyISAM表中的数据不按排序顺序存储。 InnoDB表中的数据按主键(又名clustered index)的顺序存储。

在您的示例中,如果您执行以下操作,排序将会最快:

  • 使用InnoDB表
  • time1列上创建了一个聚簇索引(以ASC或DESC顺序排列)

与索引的排序顺序匹配的查询(例如,如果您的聚簇索引也是ASC,ORDER BY time1 ASC)将执行得最快。

注意:如果time1列中的值不唯一(或者它们可能不唯一),那么您需要在该列上创建普通(辅助)索引。

答案 1 :(得分:1)

ORDER BY在将查询结果返回给客户端之前对其进行排序。它不会影响数据库中的顺序。您使用时间戳的事实无关紧要。

这里没有明显的理由认为任何一个查询都会更快。这取决于您对该表的索引。

答案 2 :(得分:0)

执行查询时会对数据进行排序。所以两个查询都应该在相似的时间内执行。

您可以查看查询计划,其中一个步骤是sorting

您可以提高查询速度,为字段time1

创建一个索引

答案 3 :(得分:0)

无论是否插入行,SELECTs都是相同的速度,无论是否有INDEX(time1)

如果没有以time1开头的索引,则任一查询都将读取整个表并对其进行排序。然后它将提供10行。

INDEX(time1) 极大地加快查询速度。它将读取索引的第一行(或最后一行),查找数据(*)并传递行。 (查找行的详细信息因MyISAM / InnoDB和PRIMARY KEY /不同而异。)

TIMESTAMP无关紧要。以上讨论适用于任何数据类型。

在MySQL 中定义索引时,DESC关键字被识别,但被忽略。所有索引都存储ASC。但是,ORDER BY .. DESC很高兴以相反的顺序遍历索引。