2

productsカテゴリを含む製品の詳細を含むテーブルを考えてみましょう。1 つの製品が複数のカテゴリに属している可能性があるため、カテゴリ ID のコンマ区切りリストとして保持しています。

私はこれが正規化されたアプローチではないことを知っています。

MYSQL の専門家なら、特定のカテゴリの製品を選択するのにどのアプローチが速いか教えてもらえますか?

正規化されたアプローチを取る場合、明らかにproducts、テーブルとテーブルを結合する必要があります。products_category_relation

私のアプローチでは、製品を見つけるために like クエリを作成する必要があります (カテゴリ ID 10 を検索していると仮定します)。

SELECT p.* 
FROM products p
WHERE p.category like '10' 
OR p.category like '10,%'
OR p.category like '%,10'
OR p.category like '%,10,%'

このアプローチの方が速いのか、それとも JOIN アプローチの方が速いのか教えてもらえますか?

正規化については知っています。私は自分のアプローチに伴う他のリスクについて知っています。しかし、私の場合は問題ではありません。なので、気になるのは速度です。

その速度または実際のテスト結果に関する理論的な説明は大歓迎です。

アップデート

myISAM エンジン製品テーブルを使用していますが、テーブルの列に主キー フルテキストproduct_id インデックスがありますcategoryproducts

4

3 に答える 3

5

関数を使ってみてくださいFIND_IN_SET

SELECT * FROM `products` WHERE FIND_IN_SET('10',`category`)>0;

その後、結果と正規化されたアプローチを比較できますが、これは複数の LIKE 句よりも確実に堅牢になります。

于 2012-06-18T12:35:59.777 に答える
3

最初の正規形に準拠するデータベースははるかに高速になります。サンプルクエリはインデックスを使用できず、解決するには全表スキャンが必要です。さらに悪いことに、すべての行についてテキストフィールド全体をスキャンする必要があり、テキスト作業はほとんどの場合、コンピューターの整数作業よりもコストがかかります。

正規化されたテーブルでは、カテゴリ列のインデックスを簡単に使用してクエリを高速化できます。

数値は通常、正しい整数型よりも文字として保存するとコストがかかるため、テキストストレージにはディスク上により多くのスペースが必要になる場合があります(もちろん、行ストレージにもオーバーヘッドが伴います)。

于 2012-06-18T12:33:12.827 に答える
1

正規化されたアプローチを取ります。

関連するテーブル、そのテーブルに設定されているキーとインデックス、および使用しているエンジンに関する情報はあまり提供されていませんが、ほとんどの場合、aは高速になります( -messJOINよりもはるかに高速です)。like

于 2012-06-18T12:33:48.623 に答える