0

私はPHP/MYSQLでマルチストアWebショップアプリケーションを書いています。商品テーブルには約100万件のレコードがあり、現在、すべての商品が含まれる5つの店舗と、いくつかの商品が含まれる約3つの店舗があります。商品の価格は店舗によって異なる場合があります。たとえばショップ2だけで特定の商品を追加または削除できるはずなので、ジャンクションテーブルを作成しました。私のテーブルは次のようになります。

products(id,name,description,price,media) ~1M records
stores(id,name)
products_stores(id,product_id,store_id,price) ~5M records

商品を検索する場合、クエリには約20秒かかります。products(name、description)+ products_stores(product_id、store_id)にインデックスを追加しました。プロセスをスピードアップする方法はありますか?products_storesのほとんどのレコードは同じですが(store_idを除く)、柔軟性を維持したいと思います。

クエリ:

SELECT 
  Product.id, 
  Product.name, 
  Product.drager, 
  Product.import, 
  Product.price, 
  Product.description, 
  Product.units 
FROM 
  products AS Product 
INNER JOIN 
  products_stores AS ProductStore ON (
    ProductStore.product_id = Product.id 
    AND 
    ProductStore.store_id =1
  ) 
WHERE 
  name LIKE 'bach%' 
ORDER BY 
  Product.description asc 
LIMIT 
  500

名前のみにFULLTEXTインデックスを追加し、ORDER BYステートメントを削除しましたが、違いはないようです。私のインデックスは次のとおりです。

Products(name) BTREE
Products(name,description) FULLTEXT
Products(name) FULLTEXT

上記のクエリの説明は次のようになります:(インデックス付き) http://i.stack.imgur.com/8Fe8C.gif

よろしくお願いします。英語が下手でごめんなさい。

4

2 に答える 2

0

クラスタ化された主キーに関する次のリンクをお読みください。

http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html

http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

MySQLとNoSQL:適切なものを選択するのを手伝ってください

InnoDBで全文のような検索を実現する方法

多対多のクエリで「一時的な使用」を回避するにはどうすればよいですか?

6000万エントリ、特定の月からのエントリを選択します。データベースを最適化する方法は?

次に、product_storesテーブルを次のように再設計します。

create table products_stores
(
store_id int unsigned not null,
product_id int unsigned not null,
...
primary key (store_id, product_id)
)
engine=innodb;

お役に立てれば :)

于 2011-10-25T12:53:38.557 に答える
0

特定の店舗の商品を探しているので、店舗IDと名前のインデックスを作成し、クエリを調整して、最初にすべての商品を調べるのではなく、特定の店舗の商品を事前に認定します。

SELECT STRAIGHT_JOIN
      P.id, 
      P.name, 
      P.drager, 
      P.import, 
      P.price, 
      P.description, 
      P.units 
   FROM 
      Product_Stores PS
         JOIN Products P
            on PS.Product_ID = P.ID
           AND P.Name like 'back%'
   WHERE
      PS.Store_ID = 1
   order by
      P.Description
   limit
      500
于 2011-10-25T14:32:50.573 に答える