1

販売情報を含むテーブルがあります。列の 1 つは と呼ばれroyalty_currency、このテーブルからすべての異なる通貨を取得する必要があります。そのためのクエリは次のとおりです。

SELECT distinct `royalty_currency` FROM `sales_raw`

この列にインデックスがない場合、Explain ステートメントは次のように表示します。

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  sales_raw   ALL NULL    NULL    NULL    NULL    195121  Using temporary

インデックスを追加すると、Explain ステートメントから次のようになります。

id  select_type table       type    possible_keys key              key_len  ref rows    Extra
1   SIMPLE      sales_raw   range   NULL          royalty_currency92        NULL    211 Using index for group-by

私の質問は、SELECT ステートメントでインデックスを使用する必要があるのはなぜですか? WHEREインデックスは句用だと思いましたか?単一の列を選択するだけで、なぜインデックスを使用する必要があるのでしょうか? 最後に、これは私が使用する一般的なクエリです。このテーブルにインデックスを追加する必要がありますroyalty_currencyか?

4

3 に答える 3

2

クエリ オプティマイザは、distinct royalty_currency要件をgroup by royalty_currency. 直感的に言えば、この 2 つが同一であることは明らかです。

テーブル自体よりも、この列のインデックスで同一の「royalty_currency」を持つレコードを見つける方が効率的であるため、group-by はインデックスを使用します (インデックスでは、これらのレコードはすべて B+ のリーフ ノードに順番に格納されます)。ツリー インデックス - B+ ツリー インデックスを想定)

より技術的な詳細を説明するために、B+ ツリーのリーフ ノードはリンク リストで接続されていると言えます。クエリ エンジンが行うことは、B+ ツリー (インデックス) の一番右のリーフに移動し、各リーフのすべての値の読み取りを開始することです。新しい値が見つかるたびにそれを返し、残りの同じ値は無視します。値。

于 2012-08-23T20:50:42.177 に答える
1

インデックスは条件に使用されるだけでなく、テーブルの結合や、あなたの場合のようにグループ化などにも使用できます。

クエリは次のように解釈されます。

select royalty_currency from sales_raw group by royaly_currency

インデックスはグループ化に使用されます。インデックスは既にグループ化されているため、これは適切に適合します。ご覧のとおり、インデックスを使用すると、参照される行の数が大幅に少なくなり、クエリで使用するリソースが大幅に少なくなります。

于 2012-08-23T20:50:37.200 に答える
-1

そこには、 のインデックスを使用していると書かれていGROUP BYます。あなたが明示的なを使用していないことは知っていますがGROUP BY、それはあなたのDISTINCT. したがって、オプティマイザーは、その列の個別の値を取得するために、インデックス (その列が彼のキーの一部であると仮定します) を使用する方がよいと考えます。

于 2012-08-23T20:47:11.627 に答える