2017-07-12 34 views
0

我有一個表「帖子」與列「熱」(reddit的算法)。 「熱」是一個十進制:XXXXX,XXXXXXXMySQL索引的十進制列ORDER BY查詢

這是我的查詢:

SELECT * FROM posts ORDER BY hot DESC 

現在我想這個查詢使用索引爲「熱」。我試過

ADD INDEX hot_index(hot) 

和SHOW INDEXES FROM posts顯示我確實創建了索引。

然而,當我跑我的查詢與「解釋」之前,我可以看到,MySQL是不使用順序的索引。爲什麼?我該如何改變它?

非常感謝!

+0

您可以通過'USE INDEX(hot_index)儘量指標提示'使得查詢'SELECT * FROM帖子使用index(hot_index )ORDER BY hot DESC'但是也許MYSQL已經打折了你的索引,因爲沒有真正的幫助 – RiggsFolly

+0

是的,這無濟於事。我也嘗試使用INT而不是小數,但是這也不會改變任何東西。 – Hillcow

+0

如果「SELECT * FROM posts ORDER BY hot DESC」是正在使用的查詢,那麼您需要表中的所有行,並且Optimizer會忽略它,因爲它是全表掃描。正如RiggsFolly建議的,如果你想確定使用索引,你可以在查詢中嘗試USE INDEX或FORCE INDEX提示。 – DeeJay14

回答

2

顯然MySQL的決定,它是快速地讀取整個表的順序和執行排序上的飛,而不是閱讀指數(從而獲得具有排序順序),但隨後必須通過訪問該帖子記錄之一一。這是一個有效的假設。

如果這會導致性能問題,那麼你可能需要一個覆蓋指數,從排序列:

create index idx on posts(hot, col1, col2, col3 ...) 

隨着select *你必須包含在索引的所有列。

隨着覆蓋索引,數據庫管理系統可以從指數本身的所有值,因此不必再訪問表。

無論如何,它仍然是可能的DBMS喜歡讀表順序,但它很可能不會。

另一點是,你降序排序,但該指數在上升。當它是關於排序,我會盡量讓指數匹配的排序順序完全相同:

​​
+0

謝謝!我想我不需要一個覆蓋索引,但很高興知道:)我會讓MySQL決定是否使用它。 – Hillcow