Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Comprendre et optimiser notre base de données W...

Comprendre et optimiser notre base de données WordPress

La base de données est le cœur battant de tout site WordPress, contenant toutes les informations cruciales nécessaires pour son fonctionnement. A l’heure où nous utilisons WordPress dans des environnements de plus en plus complexes et où des plugins créent leurs tables custom pour optimiser la gestion de leur données, il est important de comprendre l’enjeu de la couche de données. Sans une gestion et une optimisation appropriées, la base de données peut devenir un goulot d’étranglement affectant les performances globales du site. Comment juger d’une bonne structure de données ? Est-ce qu’une table custom est-elle bien conçue et ne dégrade-t-elle pas mes performances ? Faisons un tour d’horizon de ce qu’il en est et sur quoi il faut porter son attention.

Thomas Deneulin

October 16, 2023
Tweet

More Decks by Thomas Deneulin

Other Decks in Programming

Transcript

  1. Thomas DENEULIN - WordCamp Biarritz 2023 Comprendre et optimiser notre

    base de données WordPress « Vous n’avez pas les bases » […] de données - Orelsan
  2. L’importance de l’optimisation d’une base de données Frontend (PHP, HTML,

    React, …) Backend (PHP) Base de données Cache (misère)
  3. L’importance de l’optimisation d’une base de données Frontend (PHP, HTML,

    React, …) Backend (PHP) Base de données Cache (misère) « Basique, Simple »
  4. Les formes normales « Ok, j’vais (pas) sortir un nouveau

    (concept) 
 Mais, avant, il faut qu’on revoit les bases »
  5. Les formes normales Une forme normale impose des contraintes de

    modélisation pour : 1. éviter la redondance de données (donc diminuer la volumétrie) 2. empêcher les incohérences 3. limiter les processus d’écritures bloquants Il en existe 9, il faut tendre vers 3FN mais on s’arrête souvent à 2FN
  6. « Une relation est en 1FN si toutes les colonnes

    contiennent des valeurs atomiques (indivisibles) et que tous les enregistrements sont uniques » 1ere Forme Normale Etudiant
  7. « Une relation est en 1FN si toutes les colonnes

    contiennent des valeurs atomiques (indivisibles) et que tous les enregistrements sont uniques » 1ere Forme Normale Etudiant
  8. « Une relation est en 1FN si toutes les colonnes

    contiennent des valeurs atomiques (indivisibles) et que tous les enregistrements sont uniques » 1ere Forme Normale Etudiant Inscription
  9. « Une relation est en 1FN si toutes les colonnes

    contiennent des valeurs atomiques (indivisibles) et que tous les enregistrements sont uniques » 1ere Forme Normale Etudiant Inscription
  10. 1ere Forme Normale « Une relation est en 1FN si

    toutes les colonnes contiennent des valeurs atomiques (indivisibles) et que tous les enregistrements sont uniques » Cours Etudiant Inscription
  11. 2e Forme Normale Être en 1FN « Toutes les colonnes

    non-clés doivent dépendre entièrement de la clé primaire, et non d'une partie de celle-ci » Note
  12. 2e Forme Normale Note Être en 1FN « Toutes les

    colonnes non-clés doivent dépendre entièrement de la clé primaire, et non d'une partie de celle-ci »
  13. 2e Forme Normale Etudiant Cours Note Être en 1FN «

    Toutes les colonnes non-clés doivent dépendre entièrement de la clé primaire, et non d'une partie de celle-ci »
  14. 3e Forme Normale Être en 2FN Dépendance transitive : «

    Toutes les colonnes d’une table doivent être directement liées à la clé principale, et pas à une autre colonne qui, elle-même, est liée à la clé principale.» Cours
  15. 3e Forme Normale Être en 2FN Dépendance transitive : «

    Toutes les colonnes d’une table doivent être directement liées à la clé principale, et pas à une autre colonne qui, elle-même, est liée à la clé principale.» Cours
  16. 3e Forme Normale Cours Professeur Être en 2FN Dépendance transitive

    : « Toutes les colonnes d’une table doivent être directement liées à la clé principale, et pas à une autre colonne qui, elle-même, est liée à la clé principale.»
  17. Décortiquons la base de données de WordPress 12 tables •

    wp_comments ~ wp_commentmeta • wp_links • wp_options • wp_posts ~ wp_postmeta • wp_users ~ wp_usermeta • wp_terms ~ wp_termmeta • wp_term_taxonomy • wp_term relationships
  18. Décortiquons la base de données de WordPress 12 tables •

    wp_comments ~ wp_commentmeta 😱 😱 😱 😱 😱 • wp_links • wp_options • wp_posts ~ wp_postmeta 😱 😱 😱 😱 😱 • wp_users ~ wp_usermeta 😱 😱 😱 😱 😱 • wp_terms ~ wp_termmeta 😱 😱 😱 😱 😱 • wp_term_taxonomy • wp_term relationships
  19. Décortiquons la base de données de WordPress Avantage de cette

    modélisation : la fl exibilité & compatibilité (à une époque)
  20. Décortiquons la base de données de WordPress Avantage de cette

    modélisation : la fl exibilité & compatibilité (à une époque) 🤷 Mais c’est tout « Si c’est marqué sur internet, c’est p’t-être faux mais c’est p’t-être vrai »
  21. Décortiquons la base de données de WordPress Inconvénients wp_postmeta: 😱

    la colonne « meta_value » est dépendante des développeurs et peut avoir des valeurs non atomiques. (Problème lié à son utilisation) - Non 1FN 😭 Dépendance partielle de la colonne « meta_value » - Non 2FN 🤔 Possibilité d’avoir des entrées multiples avec la même combinaison « post_id » + « meta_key » 🐢 Performance dégradée
  22. Décortiquons la base de données de WordPress Ce n’est pas

    une clé étrangère Non 1FN Non 2FN Dépendance partielle
  23. Décortiquons la base de données de WordPress Ce n’est pas

    une clé étrangère Non 1FN Non 2FN Dépendance partielle Erreur d’unicité
  24. Décortiquons la base de données de WordPress Ce n’est pas

    une clé étrangère Non 1FN Non 2FN Dépendance partielle Erreur d’unicité Données sérialisées
  25. Étudions une requête WordPress en détail Récupérons des posts avec

    3 metas « seo_title », « seo_keywords » et « reading_time_minute » Nombre de posts : 25 000
  26. Étudions une requête en détail 😱 Requête complexe Volume de

    données (multiplie le nombre de lignes a analyser)
 Mémoire & CPU (plus consommatrice)
  27. Étudions la requête en détail Récupérons des articles avec 4

    metas « seo_title », « seo_keywords », « reading_time_minute » et « background_color » Nombre d’articles: 60 000 !
  28. Comparatif En moyenne, on est souvent à +50% pour 2

    fois plus de données +135% x2,4
  29. • Créer les « INDEX » et les clés étrangères

    nécessaires Les pistes d’optimisations « SQL »
  30. • Créer les « INDEX » et les clés étrangères

    nécessaires • Evitez les « LIKE » avec « % » en premier car l’INDEX de la colonne ne pourra pas être utilisée Les pistes d’optimisations « SQL »
  31. • Créer les « INDEX » et les clés étrangères

    nécessaires • Evitez les « LIKE » avec « % » en premier car l’INDEX de la colonne ne pourra pas être utilisée • Evitez les « OR » qui peuvent devoir faire des scan distincts pour chaque condition Les pistes d’optimisations « SQL »
  32. Les pistes d’optimisations « SQL » • Créer les «

    INDEX » et les clés étrangères nécessaires • Evitez les « LIKE » avec « % » en premier car l’INDEX de la colonne ne pourra pas être utilisée • Evitez les « OR » qui peuvent devoir faire des scan distincts pour chaque condition • Ne pas sérialiser des données (surtout si on doit les requêter)
  33. Ce que vous devez apprendre à aimer • Structurez vos

    données • Les plugins et thèmes avec leurs propres tables • Créez vos propres tables « Si t’es souvent seul avec tes problèmes, c’est parce que souvent l’problème c’est toi »
  34. Qu’est-ce que vous devez maintenir • Nettoyez les données orphelines

    (spams, transients, medias, …) • Limitez les révisions • Désactivez pingbacks & trackbacks (si vous n’en avez pas besoin) • Optimisez vos tables « OPTIMIZE TABLE nom_de_ta_table; » • Limitez les options (dans wp_options) « autoload » => Ne chargez que ce dont vous avez besoin