sql >> データベース >  >> RDS >> Mysql

カーディナリティが低いインデックスを使用するのは理にかなっていますか?

    次の場合、インデックスはカーディナリティの低いフィールドでも役立ちます。

    1. 可能な値の1つが他の値と比較して非常にまれであり、それを検索する場合。

      たとえば、色盲の女性は非常に少ないので、このクエリ:

      SELECT  *
      FROM    color_blind_people
      WHERE   gender = 'F'
      

      おそらくgenderのインデックスから恩恵を受けるでしょう 。

    2. 値がテーブル順にグループ化される傾向がある場合:

      SELECT  *
      FROM    records_from_2008
      WHERE   year = 2010
      LIMIT 1
      

      3しかありませんが ここでは明確な年であり、おそらく最初に古い年のレコードが追加されるため、最初の2010を返す前に非常に多くのレコードをスキャンする必要があります。 インデックス用でない場合は記録します。

    3. ORDER BY / LIMITが必要な場合 :

      SELECT  *
      FROM    people
      ORDER BY
              gender, id
      LIMIT 1
      

      インデックスがない場合、filesort 必要になります。多少最適化されていますが、LIMITを実行してください 、それでも全表スキャンが必要です。

    4. インデックスがクエリで使用されるすべてのフィールドをカバーする場合:

      CREATE INDEX (low_cardinality_record, value)
      
      SELECT  SUM(value)
      FROM    mytable
      WHERE   low_cardinality_record = 3
      
    5. DISTINCTが必要な場合 :

      SELECT  DISTINCT color
      FROM    tshirts
      

      MySQL INDEX FOR GROUP-BYを使用します 、色が少ない場合、このクエリは数百万のレコードがあっても即座に実行されます。

      これは、カーディナリティの低いフィールドのインデックスが moreであるシナリオの例です。 カーディナリティの高いフィールドよりも効率的です。

    DMLの場合は注意してください パフォーマンスはそれほど問題ではないので、インデックスを作成しても安全です。

    オプティマイザーがインデックスが非効率的であると判断した場合、インデックスは使用されません。



    1. WHERE句を使用して配列をクエリに渡す

    2. T-SQLでのSQLServer正規表現

    3. mysqlピボット/クロス集計クエリ

    4. OracleSQLの連続または重複する日付範囲の開始日と終了日を1行に出力します