1

このクエリの機能するインデックスを作成し、「ファイルソート」を取り除く方法はありますか?

SELECT id, title FROM recipes use index (topcat) where
(topcat='$cid' or topcat2='$cid' or topcat3='$cid') 
and approved='1' ORDER BY id DESC limit 0,10; 

インデックス "topcat" (列: topcat1+topcat2+topcat3+approved+id) を作成しましたが、まだ "Using where; Using filesort" を使用しています。

もう 1 つの列を作成できます。たとえば、「all_topcats」を作成して、配列に topcat 番号を格納し、1,5,7 にしてから、クエリ「... where $cid iIN ()...」を実行します。しかし問題は、この場合、「all_topcats」列は「varchar」になりますが、「承認済み」列と「id」列は int になり、いずれにせよインデックスは使用されないということです。

何か案は?ありがとう。

4

1 に答える 1

1

インデックス内の列の順序を変更すると、そのクエリのパフォーマンスが向上する可能性があります。

approved, topcat1, topcat2, topcat3, id

テーブルがどのように見えるか、およびそのような名前の列が 3 つある理由を知っておくと便利です。topcat の値を格納するサブ テーブルがあり、メイン テーブルに戻るリンクがあれば、適切なクエリを整理するのは簡単かもしれませんが、なぜそのように設定したのかを知らなければ、それが賢明かどうかを判断するのは困難です。 .

投稿できますCREATE TABLEか?

ユーザーメッセージに応じて編集

あなたのテーブルはうまく設計されているようには見えません。Category次の設計の方が適切です: 2 つの新しいテーブルとCategory_Recipe(相互参照テーブル)を追加します。Categoryカテゴリのリストが含まれ、Category_Recipe2 つの列が含まれます。1 つは既存のテーブルへの外部キーでCategory、もう 1 つは既存のRecipeテーブルへの外部キーです。の行Category_Recipeは、「このレシピはこのカテゴリにあります」というステートメントです。これで、特定のカテゴリのレシピを検索するクエリを非常に簡単に作成できるようになります。また、レシピを 3 つに制限するのではなく、任意の多くのカテゴリに配置することもできます。「データベースの正規化」と「外部キー」を参照してください。

于 2010-11-07T15:03:46.333 に答える