2011-10-24 2 views
0

J'écris une application webshop multistore en PHP/MYSQL. La table des produits a environ un million de disques, actuellement j'ai 5 magasins avec tous les produits dedans et environ 3 magasins avec quelques produits. Le prix du produit varie parfois d'un magasin à l'autre. Parce qu'il devrait être possible d'ajouter ou de supprimer certains produits, disons seulement le magasin 2, j'ai créé une table de jonction. Mes tables ressemble à ceci:Accélérer la requête de recherche (grande table de jonction)

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

Lorsque vous recherchez des produits, la requête prend environ 20 secondes. J'ai ajouté des index aux produits (nom, description) + products_stores (product_id, store_id). Y a-t-il un moyen d'accélérer le processus? La plupart des enregistrements dans products_stores sont identiques (à l'exception du store_id), mais je souhaite le garder flexible.

La requête:

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 

J'ai ajouté un index de texte intégral dans le seul nom et a supprimé la ORDER BY, mais il semble faire aucune différence. Mes indices sont maintenant:

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

EXPLIQUEZ de la requête ci-dessus donne: (avec des indices) http://i.stack.imgur.com/8Fe8C.gif

Merci à l'avance et désolé pour mon mauvais anglais.

+0

pouvez nous montrer la requête d'affichage de 20 secondes? – sled

+0

sûr, j'ai ajouté la requête. – Kaduna

+0

Vous êtes autorisé à mettre des sauts de ligne dans les requêtes. Cela peut vous faciliter la vie. :) – GolezTrol

Répondre

0

lire les liens suivants sur les clés primaires en cluster:

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 and NoSQL: Help me to choose the right one

Any way to achieve fulltext-like search on InnoDB

How to avoid "Using temporary" in many-to-many queries?

60 million entries, select entries from a certain month. How to optimize database?

puis redessiner votre table product_stores quelque chose le long des lignes de:

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

this helps :)

0

Parce que vous êtes à la recherche de produits d'un magasin spécifique, j'aurais un indice sur l'ID du magasin ET le nom, puis ajustez la requête pour pré-qualifier les produits à partir du magasin donné au lieu de regarder tous les produits en premier.

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 
Questions connexes