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

MYSQLのビットフィールドにインデックスを付ける

    一般的に言って、いいえ。平均して行の半分を確認する必要があるため、バイステートフィールドは、インデックス付けされたときにクエリを高速化しません。インデックスエントリを選択的にする必要があります。インデックス内の特定のエントリは、可能な値のごく一部のみを表す必要があります(たとえば、10%未満、できれば1パーセント未満)。次に、インデックスを使用すると、テーブル内のほとんどのデータが無視されます。これにより、パフォーマンスが向上します。

    一部のDBMSはビットマップインデックスをサポートしています。それらは役に立ちますが、それでも選択性の問題に遭遇します。

    更新された質問によると、値が1の値の数は少なくなります(1パーセント未満)。インデックスは今あなたに利益をもたらしますか?

    答えは次のとおりです。

    • 値が1であると指定するクエリの場合、オプティマイザーが実際にインデックスを使用していれば、列のインデックスがメリットをもたらす可能性があります。値が1のクエリで使用するために、インデックスが歪んでいることを認識させるために、DBMSを微調整する必要がある場合があります。これはDBMS固有の傾向がありますが、さまざまな形で統計を更新することがゲームの名前であり、SQLクエリでもヒントを使用する可能性があります。もちろん、オプティマイザーがインデックスを使用しない場合でも、メリットはありません。オプティマイザーは、他のインデックスが何らかの形でインデックスをより役立つと判断する可能性があります。

    • 値が0のクエリでは、インデックスを使用しないでください。ただし、DBMSは0の値のインデックスも維持し続ける可能性があります。ただし、それらを使用するべきではありません。非常に有益であるとしても、「この列にゼロ以外の値のインデックスを付けるだけ」と命令できるのは珍しいDBMSです。

    だから-それは依存します。クエリによって異なり、オプティマイザによって異なります。

    また、他の慣習的に使用される列の複合インデックスと、ビットフィールドがいくつかの利点を提供する可能性があることにも注意してください。したがって、ほとんどの場合、日付範囲を選択する場合は、日付列とビットフィールド列の複合インデックス(おそらくこの順序で)が適切なインデックスを提供するはずです。



    1. データベースにデータが存在するかどうかを確認する

    2. MySQL日付フィールドからの「0000-00-00」のブロック

    3. MySQLの結果セットを反復処理するにはどうすればよいですか?

    4. SELECT*列のMySQLエイリアス