2017-07-12 11 views
0

私は 'hot'(redditアルゴリズム)という列を持つテーブル 'posts'を持っています。 「ホット」、10進数です:XXXXX、XXXXXXX小数点以下の列のORDER BYクエリのMySQLインデックス

これは私のクエリです:

SELECT * FROM posts ORDER BY hot DESC 

は、今私は、このクエリは「ホット」のためにインデックスを使用したいと思います。私は、インデックスが実際に作成されたことを私に示してpostsから

ADD INDEX hot_index(hot) 

とSHOW INDEXESを試してみました。

しかし、前に 'EXPLAIN'を付けてクエリを実行すると、MySQLがインデックスのインデックスを使用していないことがわかります。どうして?どうすれば変更できますか?

ありがとうございました!

+0

あなたはINDEX(hot_indexをUSEの記事* FROM 'SELECT'クエリを作る 'のUSE INDEX(hot_index)でヒンティングインデックスを試みることができます)ORDER BY HOT DESC'しかし、多分MYSQLはあなたのインデックスを本当の助けとして割り引いていません – RiggsFolly

+0

ああ、それは残念なことに助けになりません。私も小数点の代わりにINTを使ってみましたが、それでも何も変わりません。 – Hillcow

+0

"SELECT * FROM POST ORDER BY hot DESC"が使用されているクエリの場合、テーブルからすべての行が必要であり、オプティマイザはFullテーブルスキャンのため無視します。 RiggsFollyが、インデックスを確実に使用したい場合は、クエリでUSE INDEXまたはFORCE INDEXヒントを試すことをお勧めします。 – DeeJay14

答えて

2

明らかに、MySQLは、索引を読んで(ソート順を取るのではなく)、表全体を順番に読み取ってソートを実行する方が速いと判断しますが、 1。これは正当な前提です。

これはパフォーマンスの問題につながる場合は、ソート列で始まる、カバーインデックスをしたいことがありますが、そのインデックスのすべての列を含める必要があるだろうselect *

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

カバー索引を使用すると、DBMSは索引自体からすべての値を取得できるため、もはやその表にアクセスする必要はありません。

とにかく、DBMSがテーブルを順番に読み込むことは可能ですが、そうではない可能性が非常に高いです。

もう一つのポイントは降順で並べ替えることですが、インデックスは昇順です。それはソートについてですときに、私は、インデックスが正確にソート順を一致させるために試してみた:

​​
+0

ありがとうございます!私はカバーインデックスは必要ないと思うが、知っておいてよかった。私はMySQLがそれを使うかどうかを決定させるだろう。 – Hillcow

関連する問題