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

MySQLは、チェック時にインデックスを使用しません=1ですが、=0で使用します

    MySQLがインデックスを使用しないのはなぜですか?
    MySQLは大きな割合の場合はインデックスを使用しません の行にはその値があります。

    use indexを追加する理由 ここでは機能しないクエリへ
    use indexを追加する use indexであるため、句は効果がありません。 どれを提案するだけです 使用するインデックス。インデックスを使用するかどうかは示されません。

    行数の少ないテストテーブルを使用する場合の注意事項
    これは、MySQLがインデックスの使用を拒否するため、行数の少ないテストテーブルを使用する場合に特に厄介です。また、クエリの何が問題になっているのかを確認するのは困難です。
    したがって、テストテーブルに十分な行を追加するようにしてください。それを現実的なテストにするために。

    カーディナリティの低い列にインデックスを使用することは役に立ちませんか?
    ブール列のインデックス作成は便利ではありません この質問をする前にあなたが思ったように。
    しかし、それは役に立たないでもありません どちらか。
    InnoDBを使用 MySQLは、可能であればインデックスを使用してデータを取得しようとします。ブールフィールドにインデックスがある場合は、クエリ:

    SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1
    

    bool_fieldのカバーインデックスにあるすべてのデータを読み取ることができます InnoDBのセカンダリインデックスには常にプライマリインデックスが含まれているため(id)
    MySQLはテーブル全体をメモリに読み込む必要がないため、これは高速です。

    MyISAMではこれは機能せず、MySQLはテーブル全体を調べます。

    ただし、force indexは使用できます
    可能ですが、カーディナリティインデックスが低いと、クエリが遅くなり、速くなりません。複雑なクエリのインデックスのみをオーバーライドし、のみ MySQLがインデックスを選択するために使用するルールを知っている場合。

    リンク:
    参照: http://dev.mysql .com / doc / refman / 5.1 / en / mysql-indexes.html
    および: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

    このテーマに関する本が必要な場合:読む
    高性能MySQL: http://oreilly.com / catalog / 9780596003067



    1. 2つのテーブルに一意の値を適用します

    2. MySQL ADD COLUMN

    3. 複数の緯度/経度ポイントの半径

    4. Oracleでネストされたテーブルをデータベースオブジェクトとして作成する方法