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