0

私は質問があります:

EXPLAIN SELECT * FROM _mod_news USE INDEX ( ind1 )  WHERE show_lv =1 AND active =1 AND START <= NOW( ) 
AND ( END >= NOW( )  OR END =  "0000-00-00 00:00:00" ) AND id <>  "18041" AND category_id =  "3" AND leta =1 ORDER BY sort_id ASC , DATE DESC  LIMIT 7

結果:

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  _mod_news   ref ind1    ind1    2   const,const 11386   Using where; Using filesort

mysqlは全表スキャンを実行しています

ind1 =

ALTER TABLE `_mod_news` ADD INDEX ind1 ( `show_lv`, `active`,  `start`, `end`, `id`, `category_id`, `leta`, `sort_id`, `date`);

次のインデックスでテストしましたが、何も変わりません

ALTER TABLE `_mod_news` ADD INDEX ind1 ( `show_lv`, `active`,  `start`, `end`, `id`, `category_id`, `leta`);

質問は:多くの場所の条件でインデックスを作成する方法をどこで学ぶことができますか?または、誰かがmysqlに、テーブル全体をスキャンせずに使用してインデックスを作成するように指示する方法を説明できます。ありがとう。

4

2 に答える 2

1

インデックスを強制しないことをお勧めします。Mysqlは、クエリしているデータをよく理解していない限り、可能な限り最良のインデックスを選択するのに優れています。

その部分でASCとDESCを混合しているため、ORDERBY最適化を使用することはできません。

したがって、唯一のオプションは、次のようなインデックスを作成することです。

  • 範囲の前の定数値
  • 日付の前の整数、文字列の前の日付、大きいサイズの値の前の小さいサイズの値

大きなインデックスを作成すると、ストレージと挿入更新時間にもオーバーヘッドが追加されるため、多くの行を削除しないインデックスフィールドには追加しません(つまり、90%または行の値が1またはつまりid<>"18041"、おそらく削除されます) <行の1%)。

最適化について詳しく知りたい場合:http://dev.mysql.com/doc/refman/5.0/en/select-optimization.html

複数の異なるインデックスを作成し(テーブルに表示されると予想されるデータの適切なサイズで)、どのmysqlが選択するかを確認し、それぞれを強制してベンチマークし、常識を使用してインデックススペースの使用量を削減します。

EXPLAIN出力から、実際には全表スキャンを実行していないことがわかります。その場合、強制している場合でも、インデックスを使用して表示されないためです。

于 2012-09-10T19:10:21.873 に答える
0

USEINDEXまたはFORCEINDEXで試すことができます

于 2012-09-10T15:38:42.630 に答える