2010-11-24 7 views
3

J'ai 2 tables
1) "produits" avec des champs (ProductID PK, nom, description, prix)
2) "ventes" avec des champs (salesid PK, salestime, ProductID, CustomerName, customerEmail , état)
mysql joindre problème de requête

je dois afficher les données sous forme de tableau comme

SalesID             Nom du produit             Montant             Nom du client             Adresse client             Payment Status

Pour cela, je me sers requête suivante

SELECT s.salesid, p.name, p.price, s.customername, s.customeremail, s.status 
FROM sales s 
LEFT JOIN products p ON s.productid = p.productid 
ORDER BY salestime DESC 
LIMIT 0, 15 

Est-il possible d'optimiser cette requête pour qu'elle s'exécute plus rapidement?

+0

'JOINs et' ORDER BY' sont où vous verrez un ralentissement, mais si vous les modifiez, vous ne récupérerez pas les données que vous voulez, dans l'ordre que vous voulez. La requête me semble bonne, mais un index sur les colonnes 'salestime' et' product_id' permettrait probablement d'accélérer un peu les choses. En outre, pouvez-vous stocker cette requête en tant que vue ou procédure stockée? Lorsqu'un SQL est appelé, le serveur doit compiler le code SQL, puis l'exécuter. Quand il est appelé à partir d'une vue ou stocké proc, il est précompilé par le serveur, ce qui pourrait sauver quelques millisecondes de plus .. – bakoyaro

Répondre

2

Avez-vous les index appropriés sur les tables?

Jetez un oeil à CREATE INDEX Syntax et How MySQL Uses Indexes

+0

si les tables sont déjà remplies de données, et je les indexer, ils ne feront aucune différence? devrais-je supprimer toutes les données, puis créer un index ou existe-t-il un autre moyen? –

+0

NON non non non. Créer l'index avec des données dans les tables devrait être bien. –

+0

OK, merci pour l'aide, et de fournir des réponses –

0

La requête est aussi bonne que possible. De par leur nature, les requêtes spécifient QUOI faire, pas comment le faire.

Il est le SGBDR dessous qui effectuera votre performance, et le principal moyen d'impact sur une requête comme ceci est d'ajouter des index les colonnes sur lesquelles vous JOIN (le de oroductid de chaque table)

+0

est-il bon d'utiliser equi-join ou left-join est approprié? –

+1

dépend du résultat que vous voulez. Si aucune correspondance n'est faite entre les deux tables pour une certaine ligne (de votre table "gauche"), voulez-vous que ces champs soient affichés avec les valeurs nulles de la contrepartie dans l'autre table (LEFT JOIN)? ou voulez-vous juste qu'il ne soit pas listé (INNER JOIN, dont EQUI est un type)? –

0

La requête est très bien. Essayez d'indexer productid dans les deux tableaux, ainsi que salestime.

+0

si les tables sont déjà remplies de données, et que je les indexe, elles ne feront aucune différence? devrais-je supprimer toutes les données, puis créer un index ou existe-t-il un autre moyen? –

+0

Ajoutez simplement les index et ils indexeront les données existantes. – RedFilter