1

非常に大きなデータベースがあり、非常に簡単に質問すると、日付フィールドにインデックスを追加する必要があるかどうかを判断できません。

私のクエリは次のとおりです。テーブル A の日付フィールドにインデックスを追加する必要があります。これは非常に大きく、日付です (形式: 2013-02-26 18:52:23)。以下は私の質問です:

      SELECT As.id 
      FROM As INNER JOIN A_items ON A_items.A_id = As.id AND A_items.type IN ('BilledItem', 'CustomerItem') 
      WHERE   (As.A_date BETWEEN '2013-01-15 18:52:23' AND '2013-01-30 18:52:23') AND A_items.category_id in ('20219') and A_items.product_id IN ('ACCDYHGYUDZNY7FZ')

これについて説明を使用すると、次の結果が得られます:-

      *************************** 1. row ***************************
      id: 1
      select_type: SIMPLE
      table: A_items
      type: ref
      possible_keys: index_A_items_on_A_id,index_A_items_on_product_id,i_type_parent_id_item_type
      key: index_A_items_on_product_id
      key_len: 258
      ref: const
      rows: 221122
      Extra: Using where
      *************************** 2. row ***************************
      id: 1
      select_type: SIMPLE
      table: As
      type: eq_ref
      possible_keys: PRIMARY
      key: PRIMARY
      key_len: 8
      ref: database.A_items.A_id
      rows: 1
      Extra: Using where
      2 rows in set (0.00 sec)

ただし、クエリから A_items.product_id IN ('ACCDYHGYUDZNY7FZ') を削除して、これを実行すると:-

      explain
      SELECT As.id 
      FROM As INNER JOIN A_items ON A_items.A_id = As.id AND A_items.type IN ('BilledItem', 'CustomerItem') 
      WHERE   (As.A_date BETWEEN '2013-01-15' AND '2013-01-30') AND A_items.category_id in ('2005')

私は得る:-

      *************************** 1. row ***************************
      id: 1
      select_type: SIMPLE
      table: As
      type: ALL
      possible_keys: PRIMARY
      key: NULL
      key_len: NULL
      ref: NULL
      rows: 15427520    <--Notice this big number
      Extra: Using where
      *************************** 2. row ***************************
      id: 1
      select_type: SIMPLE
      table: A_items
      type: ref
      possible_keys: index_A_items_on_A_id,i_type_parent_id_item_type
      key: index_A_items_on_A_id
      key_len: 8
      ref: database.As.id
      rows: 1
      Extra: Using where
      2 rows in set (0.00 sec)

私の質問は、最初のクエリでこの多数の行が表示されない理由と、日付フィールドにインデックスを追加するかどうかを決定する方法です???

4

3 に答える 3

2

それは本当にあなたのデータに依存します。あなたができる最善のことは、そのインデックスで試すことです。インデックスが役立つかどうかは、クエリの種類と、この場合は日付範囲によって異なります。選択した範囲がかなり小さい場合は、index が役立ちます。ただし、たとえば、テーブルが 1 か月間だけデータを保持し、20 ~ 25 日間のデータを選択した場合でも、オプティマイザーはインデックスを無視することを選択する可能性があります。オプティマイザーは常に、より少ない行を生成するインデックスを選択しようとします (ただし、オプティマイザーはそれを正確には認識していません。これはインデックス カーディナリティによって推定されるため、特定の状況では不正確になる可能性があります)。

余分なインデックスがあっても SELECT に影響はありませんが、余分なインデックスがあるたびに、すべてのインデックスも更新する必要があるため、すべての INSERT と UPDATE が遅くなります。そのため、選択に比べてこのテーブルへの挿入が比較的少ない場合は、この特定のクエリに役立たなくても、この追加のインデックスを使用できます。

于 2013-03-07T13:09:59.903 に答える
1

最初のクエリでは、より多くのクエリ制限があり、テーブル スキャンが少なくなります。行数が少ないのはそのためです。日付フィールドにインデックスを追加すると、クエリが高速化されるはずです(少なくとも役に立ちました)。なぜそれを試さないのですか?

于 2013-03-07T00:16:48.863 に答える
1

その行数がテーブルの行数にかなり近いと思われる場合、2番目のインスタンスでテーブルスキャンを実行することを選択していると思います。これは、テーブル全体をスキャンするのではなく、インデックスからプルすることを選択するため、日付のインデックスが役立つ可能性があることを示しています。

于 2013-03-07T00:49:45.047 に答える