我有一张桌子" tab1"它有一个时间戳字段" time1"。假设该表有100万条记录。我有以下两个测试查询:
select * from tab1 order by time1 desc limit 0,10
select * from tab1 order by time1 asc limit 0,10
当我们使用时间戳时,是否按照时间戳的排序顺序存储在数据库中的记录,还是在使用order by子句时必须在显示结果集之前对它们进行排序?
如果排序完成,那么查询1和查询2中哪一个更快?
答案 0 :(得分:1)
这取决于存储引擎/表类型的类型。 MyISAM表中的数据不按排序顺序存储。 InnoDB表中的数据按主键(又名clustered index)的顺序存储。
在您的示例中,如果您执行以下操作,排序将会最快:
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
很高兴以相反的顺序遍历索引。