Question

Peut-on obtenir une liste des techniques d'optimisation de base allant (quoi que ce soit de la modélisation à l'interrogation, la création d'index, vue sur l'optimisation des requêtes). Il serait agréable d'avoir une liste de ces derniers, une technique par réponse. En tant que bricoleur, je trouve cela très utile, merci.

Et pour le bien de ne pas être trop vague, disons que nous utilisons un maintstream DB tel que MySQL ou Oracle, et que la base de données contiendra 500,000-1m ou si les enregistrements à travers ~ 10 tables, certaines avec contraintes de clés étrangères, tout en utilisant le plus les moteurs de stockage typiques (par exemple: InnoDB pour MySQL). Et bien sûr, les bases telles que définies sont PKs ainsi que FK contraintes.

Était-ce utile?

La solution

.

En savoir plus sur les indices et les utiliser correctement * D'une manière générale, procédez comme suit:

  • Chaque tableau doit avoir un index ordonné en clusters
  • Les champs utilisés pour les filtres et les tris sont de bons candidats pour l'indexation
  • Plus sélectif sont de meilleurs candidats pour l'indexation
  • Pour de meilleures performances sur les requêtes cruciales, la conception « couvrant les index » pour ces requêtes
  • Assurez-vous que vos index sont effectivement utilisés, et supprimer ceux qui ne sont pas
  • Si votre table a 15 champs, et vous faire 15 index, chacun avec seulement un seul champ, vous le faites mal:)

* Il y a quelques exceptions à ces règles si vous savez ce que vous faites. Mon expérience est Microsoft SQL Server, mais je suppose la plupart de ces conseils s'appliqueraient encore à un autre SGBDR.

Autres conseils

OMI, de loin la meilleure optimisation est d'avoir le modèle de données correspondent au domaine de problème pour lequel il a été construit. Quand il ne est pas, le symptôme résultant est difficile à écrire ou requêtes alambiqué afin d'obtenir l'information désirée et que généralement se cabre lorsque les rapports sont construits sur la base de données. Ainsi, dans la conception d'une base de données, il est utile d'avoir une idée sur les types et la nature des informations, tels que les rapports, que les utilisateurs veulent du système.

Quand on parle de la conception base de données, consultez la normalisation de base de données, par exemple l'article wikipedia. formes normales

Si vous avez une bonne conception et encore vous avez besoin pour optimiser la performance, essayez Dénormalisation .

Si vous avez des besoins spécifiques qui ne sont pas couverts par le modèle relationnel efficace, regard sur d'autres modèles couverts par le terme NoSQL .

Certaines optimisations de requêtes / schéma:

  • Soyez conscient lors de l'utilisation BY DISTINCT ou GROUP. Je trouve que beaucoup de nouveaux développeurs utiliseront DISTINCT dans des endroits où il est vraiment pas nécessaire ou pourrait être réécrite plus efficacement à l'aide d'une déclaration ou une Existant requête dérivée.

  • Soyez conscient de jointures gauche. Tout ce que je trouve trop souvent de nouveaux développeurs SQL ignorera le schéma en place et utiliser gauche rejoint là où ils ne sont pas vraiment nécessaires. Par exemple:

Select
From Orders
    Left Join Customers
        On Customers.Id = Orders.CustomerId

Si Orders.CustomerID est une colonne obligatoire, alors il est nécessaire d'utiliser une jointure gauche.

  • Être étudiant de nouvelles fonctions. À l'heure actuelle, MySQL ne supporte pas les expressions de table commune qui signifie que certains types de requêtes sont lourdes et probablement plus lente à écrire que ce qu'ils seraient si CTEs ont été pris en charge. Cependant, ce ne sera pas vrai pour toujours. Continuez sur les nouvelles fonctionnalités de syntaxe dans MySQL qui pourraient être utilisés pour effectuer des requêtes existantes plus efficaces.

  • Vous ne devez pas utiliser les clés de substitution partout. Il pourrait y avoir des tables mieux adaptés à une clé intelligente (par exemple les abréviations des États-Unis, des codes de devises, etc.) qui permettrait aux développeurs d'éviter des jointures supplémentaires dans de nombreux cas.

  • Si possible, trouver des moyens de l'archivage des données à un serveur de rapports OLAP ou. Le plus petit, vous pouvez rendre les données de production, plus vite il sera exécuté.

Une conception que les modèles de façon concise votre problème est toujours un bon point de départ. Surgénéralisation le modèle de données peut entraîner des problèmes de performance. Par exemple, je l'ai entendu les rapports des projets qui luttent pour uber-flexibilité qui utilisent les SGBDR comme un magasin muet « nom / valeur » - et la performance résultant était épouvantable

.

Une fois une bonne conception est en place, utilisez les outils fournis par le SGBDR pour l'aider à obtenir de bonnes performances. seul champ PK (pas de composites), mais clés métier composites comme indice de contrainte unique, l'utilisation de types de données appropriés, par exemple, en utilisant les types numériques appropriés pour les valeurs numériques plutôt que char ou similaire. Les attributs physiques du matériel SGBDR est en cours d'exécution sur devraient également être pris en considération, étant donné que la majeure partie du temps de requête est souvent E / S disque - mais bien sûr, ne prennent pas pour acquis - utiliser un profileur pour savoir où le temps va .

En fonction du rapport mise à jour / requête, vues matérialisées / vues indexées peuvent être utiles pour améliorer les performances des requêtes en cours d'exécution lente. Un pauvre homme L'alternative est d'utiliser les déclencheurs d'invoquer une procédure qui renseigne la table avec un résultat d'une marche lente, vue peu fréquemment changé.

L'optimisation des requêtes est un peu un art noir car il est souvent dépendante de la base de données, mais certaines règles empiriques sont données ici - Optimizing SQL .

Enfin, bien que peut-être en dehors de la portée prévue de votre question, utilisez une couche d'un bon accès de données dans votre application, et éviter la tentation de rouler votre propre - il y a sûrement testées et mises en œuvre disponibles pour toutes performantes langues principales. Utilisation de la mise en cache à la couche d'accès aux données, niveau intermédiaire et de la couche d'application peuvent contribuer à améliorer considérablement les performances.

Utilisez- moins requête lorsque cela est possible. Utilisez « join », et regroupez vos tables de sorte qu'une seule requête donne des résultats.

Un bon exemple est le modifié Précommande Arbre Transversal ( MPTT ) pour obtenir tous un des parents de nœud d'arbre, a ordonné, en une seule requête.

Adopter une approche holistique de l'optimisation.

Considérez l'impact des disques lents, la latence du réseau, le manque de mémoire, et la charge du serveur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top