2016-01-23 45 views
0

我有一個表「tab1」,它有一個時間戳字段「time1」。假設該表有100萬條記錄。我有以下兩個測試查詢:在使用時間戳時order by clause如何工作?

  1. select * from tab1 order by time1 desc limit 0,10
  2. select * from tab1 order by time1 asc limit 0,10

當我們使用時間戳,存儲在時間戳的排序順序數據庫中的記錄或他們之前進行排序在使用order by子句時顯示結果集?

如果排序完成,那麼在查詢1和查詢2之外,哪一個更快?

回答

0

這兩個SELECTs是等速的,無論如何插入行,也不管是否有INDEX(time1)

如果沒有以time1開頭的索引,則任一查詢都將讀取整個表並對其進行排序。然後它將交付10行。

已有INDEX(time1)很大加快查詢。它將讀取索引的第一個(或最後一個)10行,查找數據(*)並傳遞行。 (查找行的細節因MyISAM/InnoDB和PRIMARY KEY而異。)

TIMESTAMP是無關緊要的。上述討論適用於任何數據類型。

在在MySQL限定索引,所述DESC關鍵字被確認,但是忽略。所有索引都存儲在ASC。但是,ORDER BY .. DESC很樂意以相反的順序遍歷索引。

+0

我不知道如何使用索引(time1) – rosemary

+0

'ALTER TABLE tab1 ADD INDEX(time1);' - 這可能會使您的兩個查詢運行得更快。 –

+0

謝謝@Rick James – rosemary

0

數據在查詢執行時排序。所以這兩個querys應該在相似的時間執行。

您可以查看查詢計劃,並會看到其中一個步驟是sorting

可以提高查詢速度創造了場time1

1

一個指數,取決於存儲引擎/表類型的類型。 MyISAM表中的數據不按排序順序存儲。 InnoDB表中的數據按主鍵的順序存儲(又名clustered index)。

在你的榜樣,排序將是最快的,如果你:

  • 使用InnoDB表
  • 創建的time1列聚集索引(以升序或降序排列)

的查詢與索引的排序順序匹配(例如,如果您的聚簇索引也是有序的ASC,則ORDER BY time1 ASC)將執行得最快。請注意:如果time1列中的值不是唯一的(或者它們可能不是唯一的),那麼您需要在該列上創建一個普通(二級)索引。

+0

這只是一個示例表,我沒有在該表中使用主鍵。如何在該列上創建普通或二級索引? – rosemary

+0

@rosemary,看看[CREATE INDEX語法](http://dev.mysql.com/doc/refman/5.7/en/create-index.html) – Serge

+0

在定義索引_in MySQL_時,'DESC'關鍵字被識別,但被忽略。所有索引都存儲在'ASC'中。然而,'ORDER BY .. DESC'很樂意以相反的順序遍歷索引。 –

1

ORDER BY在將查詢結果返回給客戶端之前對查詢結果進行排序。它不會影響數據庫中的順序。你使用時間戳的事實是無關緊要的。

這裏沒有任何理由可以假設任何一個查詢都會更快。這取決於你對錶格的索引。

+0

這意味着它會對錶中的enire記錄進行排序,在我們的情況下是100萬條記錄,然後給出10條排序記錄? – rosemary

+0

Tnq ..我的一票在這裏 – rosemary

+0

@rosemary不,它將結果集排序,正如我已經說過的那樣。 – EJP