これが私のテーブルです:
私のテーブルで
Clustering_key
(主キーおよび自動増分)ID
(インデックス列)Data
(テキストデータ型列)Position
(インデックス列)Data
の順序を維持します私のテーブルには、同じID
が5に等しい90,000行があります。最初の3行と次のようなクエリをフェッチしたい
Select * from mytable where ID=5 Limit 3;
ID
列はインデックス列なので、mysqlは最初の3行のみをスキャンすると思いますが、mysqlは約42000行をスキャンします。
ここで説明クエリ:
すべての行のスキャンを回避する可能性。
解決策を教えてください
前もって感謝します
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行で、テーブルサイズと一致する数値が表示されません。
@Rick Jamesがより多くの情報を取得することについて言ったことの補足として、Performance Schemaがインストールされて有効になっている場合、十分な権限でMySQL Workbenchでクエリを実行し、GUIを介して詳細な実行情報を取得できます(「クエリ統計」を参照してください)。これを自動的に行うには、パフォーマンススキーマの監視レベル「サーバーのデフォルト」のみが必要です。特にステージング環境や開発マシンで、あなたのような状況や他の高速クエリに適しています。
レプリケートされた設定であなたのクエリを実行すると、3つの行のみが検査されることがレポートでわかります。