2010-12-23 8 views
1

Je crée une application web de commerce électronique en utilisant PHP et MYSQL (MYISAM). Je veux savoir comment accélérer mes requêtesoptimisation mysql pour une grande base de données

J'ai une table de produits avec plus d'un million d'enregistrements avec les colonnes suivantes: id (int, primaire) catid (int) usr (int) titre (int) description (int) status (enum) date (datetime)

récemment divisé cette table en plusieurs tables basées sur les catégories de produits (catid). penser que cela pourrait réduire la charge sur le serveur.

Maintenant, j'ai besoin d'aller chercher les résultats de ces tables combinées avec les ensembles suivants de conditions 1. résultats correspondant à un usrid et le statut. Maintenant, je dois utiliser UNION pour aller chercher les résultats de toutes ces tables combinées, ce qui ralentit la permormance aussi je peux N'appliquez pas la LIMITE au jeu de résultats combinés. J'ai pensé à créer un index sur toutes ces colonnes pour accélérer la recherche, mais cela pourrait ralentir les INSERTS et les mises à jour. aussi je commence à croire que la division de la table n'était pas une bonne idée en premier lieu.

Je voudrais connaître la meilleure approche pour optimiser la récupération de données dans une telle situation. Je suis également ouvert aux nouvelles propositions de schémas de bases de données.

+0

Pouvez-vous s'il vous plaît nous fournir un exemple de configuration de base de données? En outre, avez-vous envisagé d'utiliser 'JOIN '? – Bobby

+0

Il serait utile que vous donniez un aperçu de votre schéma de base de données actuel, avec les tables et les clés appropriées. Pour les tables contenant des millions d'enregistrements, je suggère de ne pas les associer ou de les joindre à d'autres tables, mais de faire des requêtes uniques sur la table et de laisser le script combiner vos résultats. – Oli

+1

En ce qui concerne les index: http://stackoverflow.com/questions/4377525/using-more-than-one-index-per-table-is-dangerous/4382833#4382833 – Ronnis

Répondre

1

Pour commencer: load test et allumez le MySQL slow query log.

Quelques autres suggestions:

Si vous séjournez avec des tables séparées par catégories d'utilisation UNION ALL au lieu de UNION. Raison étant UNION implique la distinction, ce qui rend le moteur de base de données faire un travail supplémentaire pour dédupler les lignes inutilement.

Les index ajoutent une pénalité d'écriture, mais ce que vous décrivez a probablement un rapport lecture-écriture d'au moins 10 à 1 et probablement plus de 1000 à 1 ou plus. Donc index. Pour les deux requêtes que vous décrivez, je créerais probablement trois indices (vous devrez étudier les plans d'explication pour déterminer quel ordre de colonne est le meilleur).

  1. usrid et le statut
  2. statut et le titre
  3. état et la description (est-ce un champ indexable?)

Une autre note sur les indices, creating a covering index, qui est celui qui a toutes vos colonnes , peut également être une solution utile si l'un de vos modèles d'accès fréquents est récupéré par la clé primaire.

0

Avez-vous envisagé d'utiliser memcached? Il met en cache le jeu de résultats à partir des requêtes de base de données sur le serveur et les renvoie si elles sont demandées par plusieurs utilisateurs. S'il ne trouve pas de jeu de résultats de cache, alors seulement il interrogera la base de données. Il devrait alléger la charge sur la base de données de manière significative.

http://memcached.org/

+0

J'ai remarqué que mysql fournit intrinsèquement les mécanismes de mise en cache pour les requêtes. mais je suis à la recherche d'optimisation du point de vue de la conception de requêtes et de schémas. –

Questions connexes