0

I have similar situation like question below.

Mysql speed up max() group by

SELECT MAX(id) id, cid FROM table GROUP BY cid

To optimize above query (shown in the question), creating index(cid, id) does the trick.

However, when I add a column that is not indexed to SELECT, query speed drastically slows down.

For example,

SELECT MAX(id) id, cid, newcolumn FROM table GROUP BY cid

If I create index(cid, id, newcolumn), query time comes back to minimal. It seems I should index all the columns I select while using GROUP BY.

Is there any way other than indexing all the columns to be select?

4

1 に答える 1

1

クエリで使用されるすべての列がインデックス (カバリング インデックスと呼ばれる) の一部である場合、SQLite はインデックスからすべての値を取得でき、テーブル自体にアクセスする必要はありません。

インデックスが作成されていない列を追加する場合、各レコードをインデックスとテーブルの両方で検索する必要があります。さらに、テーブル内のレコードの順序がインデックス内の順序と同じになる可能性は低いため、テーブルのページは順番どおりに読み取られず、複数回読み取られます。つまり、キャッシュも機能しません。

値はnewcolumnテーブルまたはインデックスから読み取る必要があります。データを保存する他のメカニズムはありません。

tl;dr: いいえ

于 2013-07-05T19:25:52.843 に答える