Assets
InnoDBエンジンに次のように定義されたテーブルがあります。
CREATE TABLE Assets (
qid SMALLINT(5) NOT NULL,
sid BIGINT(20) NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (sid,qid),
KEY sid (sid)
);
私は次のクエリを実行しています:
SELECT COUNT(*) FROM Assets WHERE sid>10000;
私のマシンでは、このクエリは約30秒かかり、テーブルに200万のエントリがあります。ここで、インデックスを使用するようにクエリを変更すると、結果は大きく異なります。
SELECT COUNT(*) FROM Assets USE INDEX(<index>) WHERE sid>10000;
NO INDEX
:明示的ではありませんUSE INDEX
。つまり、最初のSELECT
クエリ:30秒KEY sid (sid)
:1.5秒KEY cid (sid,qid)
:1.5秒PRIMARY
:USE INDEX(PRIMARY)
クエリ内で使用しました。:30秒
だからこれらは私の質問です:
これに基づいて、クエリは自動的に主キーをインデックスとして使用すると思いました。それでも、との間には大きな違いが
USE INDEX (cid)
ありNO INDEX
ます。違いは何ですか?また、主キーをインデックスとして明示的に指定するにはどうすればよいですか?NO INDEX
実際に主キーをインデックスとして使用しない場合USE INDEX(PRIMARY)
、実行時間が同じになる原因は何NO INDEX
ですか?フィルタリングのみを行うクエリとの
USE INDEX(sid)
間に(パフォーマンスだけでなく)違いはありますか?USE INDEX(cid)
sid
長い投稿は許してください、しかし私はそれを議論に開放させたかったのです。
さて、これが私がこれまでに見つけたものです:
まず、キーの設定は次のいずれかである必要があると言われています:PRIMARY KEY(qid,sid), KEY(sid)
またはPRIMARY KEY(sid,qid), KEY(qid)
。違いがよくわかりません。もしそうなら、私に知らせてください。
次に、KEY sid
(sid
)は、大きなキーよりもはるかに少ないインデックスページを参照するため、高速になる傾向があります。PRIMARY KEYをインデックスとして使用する場合と適切なKEYを使用する場合(同じフィールドを使用している場合でも)の違いについては、次のように言われています。
主キーは、主キーのフィールドを使用してテーブルデータ全体にインデックスを付けます。これは、PRIMARYKEYとデータが一緒に保存されることを意味します。したがって、PRIMARY KEYを使用するクエリは、テーブルデータ全体を処理する必要があり、インデックスが作成されていても、キャッシュできない大きなテーブルに行き詰まります。
個別のキーを使用すると、行数は同じになる可能性がありますが、はるかに小さいインデックス(指定されたフィールドで構成される)がスキャンされ、より少ない数のディスクブロックにヒットするため、実行速度が大幅に向上します。これが、主キーをインデックスとして使用する場合と使用する場合の違いの理由でもあると思いUSE INDEX(cid)
ます。どちらも同じフィールドを持っています。