web-dev-qa-db-ja.com

すべての行をスキャンせずに、インデックス列のクエリで制限を使用するにはどうすればよいですか?

これが私のテーブルです:

enter image description here

私のテーブルで

  • Clustering_key(主キーおよび自動増分)
  • ID(インデックス列)
  • Data(テキストデータ型列)
  • Position(インデックス列)Dataの順序を維持します

私のテーブルには、同じIDが5に等しい90,000行があります。最初の3行と次のようなクエリをフェッチしたい

Select * from mytable where ID=5 Limit 3;

ID列はインデックス列なので、mysqlは最初の3行のみをスキャンすると思いますが、mysqlは約42000行をスキャンします。

ここで説明クエリ:

enter image description here

すべての行のスキャンを回避する可能性。

解決策を教えてください

前もって感謝します

3
Shubham

EXPLAINは、希望するほどスマートではありません。 42415気付かずにLIMIT 3

インデックスを使用するという重要な手がかりは、Key列がインデックス名をリストすることです。

そのクエリは、そのインデックス(IDは数値データ型であると想定しています)を使用すると、インデックスの3行のみ、次にデータの3行のみを処理します。

詳細情報を取得する2つの方法:

EXPLAIN FORMAT=JSON SELECT ...;

または

FLUSH STATUS;
SELECT ...
SHOW SESSION STATUS LIKE 'Handler%';

2(3-1)1行または2行で、テーブルサイズと一致する数値が表示されません。

3
Rick James

@Rick Jamesがより多くの情報を取得することについて言ったことの補足として、Performance Schemaがインストールされて有効になっている場合、十分な権限でMySQL Workbenchでクエリを実行し、GUIを介して詳細な実行情報を取得できます(「クエリ統計」を参照してください)。これを自動的に行うには、パフォーマンススキーマの監視レベル「サーバーのデフォルト」のみが必要です。特にステージング環境や開発マシンで、あなたのような状況や他の高速クエリに適しています。

レプリケートされた設定であなたのクエリを実行すると、3つの行のみが検査されることがレポートでわかります。

0
mrdr