1

ACID機能があるため、INNODBでアプリケーションをゼロから構築しました。しかし、私は少し障害物にぶつかりました。製品テーブルがあり、各製品のカテゴリは区切り記号で区切られています。合計で約 1800 の固有のカテゴリがあり、各製品は一度に約 3 ~ 4 に関連付けられています。約 300,000 行のユニークな製品があります。

私は本に従ってこれを試し、カテゴリごとに別のテーブルを作成して正規化し、多対多の関係を使用してそれらを製品に関連付けました。ただし、問題は、products テーブル自体が約 300,000 行であり、そこに約 900,000 行の多対多のカテゴリ関連テーブルが追加されていることです。2 つのテーブル間の結合で妥当な速度を得ることはほとんど不可能です....

この場合、products テーブルの独自の TEXT フィールドに未加工の形式でカテゴリを格納することによって、少し非正規化するとどうなりますか。カテゴリに基づいてこれらの製品をフィルタリングするには、全文検索を使用できますか? このようなアプローチの長所と短所は何ですか?

ちなみに、私は共有サーバーを使用しているため、バッファーサイズを増やしたり、メモリ管理を利用して InnoDBを実際に利用したりすることはできません。

解決済み もしできれば、本を読む (正規化する) ことでスピードが犠牲になったように見えるという私の誤った幻想を嘲笑し、嘲笑したすべての人に賛成票を投じたいと思います。実際には、一貫性が得られ、あちこちでいくつかのインデックスを微調整することで、超高速の速度が得られます。みんな、ありがとう。

4

1 に答える 1

3

あなたの主題は、InnoDB の代わりに MyISAM の使用を検討していることを示唆していますが、あなたの質問は非正規化の価値について尋ねています。

データベース列に区切られたリストを格納するのは本当に悪いですか?への私の回答を参照してください。

特定の製品のカテゴリを常に知る必要がある場合は、非正規化が役立ちます。特定のカテゴリの製品を知る必要がある場合は、さらに悪化します。そうでない場合は、カテゴリ テーブルの各行に冗長な製品リストを格納する必要があります。それらを同期させて頑張ってください。

適切なインデックスがあれば、300k のテーブルを 900k のテーブルに結合するのは簡単で効率的です。

EXPLAIN を使用してクエリを最適化する方法を学ぶ必要があります。

于 2012-11-29T18:33:27.070 に答える