着実に増加している商品の十分に大きなデータベースがあります。現在、DB には 1000 万を超える商品があります。
良いものとそのカテゴリーがあります。各商品には、名前、価格、販売された商品の量、保証のフラグ、および品質などの属性があります。特定のカテゴリにのみ固有の商品の特性があります。商品のプロパティは、次の形式 - 2000:10000 (プロパティのカテゴリ: プロパティの値) を持っています。プロパティの一部のカテゴリとプロパティ自体は、ブランドなどのさまざまなカテゴリで重複する場合があります。これらのカテゴリとプロパティによって、タイトルとプロパティのフィルタリング、ソート、および検索が行われます。製品は、1 つまたは複数のカテゴリにリンクできます。
最初はmysqlだけを使って、カテゴリごとにテーブルを作って商品を保管していました。このようにして、約 6 ~ 7,000 の商品付きのテーブルがありました。選択中に、オペレーターUNIONの助けを借りてリクエストをマージして、それぞれにリクエストを行いました。商品数とそのカテゴリが増えると、選択に非常に時間がかかり、mysql サーバーが停止します。この後、すべての製品を 1 つのテーブルに移動しました。テーブル構造は【以下】( http://clip2net.com/s/5OUKXm .
1,000 万の製品を含むテーブルでは、現在 mysql を使用することが難しくなっています。ソートについて話さずに、そこから選択することはまったく不可能です。スフィンクス、インデックス スフィンクスを使用しました。
sql_query = SELECT \
ti.item_id, \
ti.item_id AS iid, \
crc32(ti.item_nick) AS nick, \
ti.item_title AS title, \
ti.item_sold AS sold, \
ti.item_rating AS rating, \
ti.item_popular AS popular, \
ti.item_warranty AS warranty, \
ROUND(ti.item_price*100, 0) AS price, \
ti.item_props AS props, \
COUNT(c.comment_iid) AS comments, \
GROUP_CONCAT(tcir.category_item_ref_tid) AS tids \
FROM item AS ti \
LEFT JOIN comment AS c ON ti.item_id = c.comment_iid \
INNER JOIN category_item_ref AS tcir ON ti.item_id = tcir.category_item_ref_iid \
WHERE ti.item_id >= $start AND ti.item_id <= $end \
GROUP BY ti.item_id
sql_attr_uint = sold
sql_attr_uint = rating
sql_attr_uint = comments
sql_attr_uint = warranty
sql_attr_bigint = iid
sql_attr_bigint = nick
sql_attr_bigint = price
sql_attr_bigint = popular
sql_attr_multi = uint tids from field;
Sphinx を介した検索は高速ですが、多くの属性があり、特に検索とソートが遅くなる sql_attr_multi tid があります。60万品のサンプリング時間は約18~19秒。製品を 1 つのカテゴリのみに関連付けようとしました (属性 tids は sql_attr_uint になりました)。サンプリング時間は 3 ~ 5 秒に短縮され、これもあまり良くありません。
私が間違っていることを教えてください.Sphinxのインデックスを別の方法で構築する価値があるかもしれません. おそらく、別の方法でテーブル構造を構築するか、MySQL、MongoDB、PostgreSQL、MariaDB などのデータベースに別のプラットフォームを使用する必要があります。