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

MySQL:カーディナリティ/選択性の低い列=インデックスを作成する方法

    あなたが説明するインデックスはほとんど無意味です。インデックスは、小さいを選択する必要がある場合に最適です。 合計行数と比較した行数。

    この理由は、データベースがテーブルにアクセスする方法に関連しています。テーブルは、各ブロックが順番に読み取られて処理される全表スキャンのいずれかによって評価できます。または、データベースにキー/行IDがあり、必要な正確な行を読み取る、ROWIDまたはキールックアップによって。

    主キーまたは別の一意のインデックスに基づくwhere句を使用する場合。 where id = 1 、データベースはインデックスを使用して、行のデータが格納されている場所への正確な参照を取得できます。これは、全表スキャンを実行してすべてのブロックを処理するよりも明らかに効率的です。

    例に戻ると、where status = 'enabled'のwhere句があります。 、インデックスは150m行を返し、データベースは個別の小さな読み取りを使用して各行を順番に読み取る必要があります。全表スキャンでテーブルにアクセスすると、データベースはより効率的な大規模な読み取りを利用できます。

    インデックスを使用するよりも、テーブル全体のスキャンを実行する方がよい場合があります。 mysqlでは、FORCE INDEX (idx_name)を使用できます。 クエリの一部として、各テーブルアクセス方法を比較できるようにします。

    参照: http:// dev .mysql.com / doc / refman / 5.5 / en / how-to-avoid-table-scan.html



    1. MySQLサーバーとMySQLクライアントの違いは何ですか

    2. SQL Serverでクエリ結果をコンマ区切りリストとして返す方法– STRING_AGG()

    3. 1つのクエリで2つのテーブルにOracleINSERTを実行

    4. A-ZによるMySQL5.5パーティションテーブル