Slide 1

Slide 1 text

Thomas DENEULIN - WordCamp Biarritz 2023 Comprendre et optimiser notre base de données WordPress

Slide 2

Slide 2 text

Thomas DENEULIN - WordCamp Biarritz 2023 Comprendre et optimiser notre base de données WordPress « Vous n’avez pas les bases » […] de données - Orelsan

Slide 3

Slide 3 text

L’importance de l’optimisation d’une base de données

Slide 4

Slide 4 text

L’importance de l’optimisation d’une base de données Frontend (PHP, HTML, React, …) Backend (PHP) Base de données

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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 »

Slide 8

Slide 8 text

Les formes normales « Ok, j’vais (pas) sortir un nouveau (concept) 
 Mais, avant, il faut qu’on revoit les bases »

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

« 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

Slide 11

Slide 11 text

« 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

Slide 12

Slide 12 text

« 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

Slide 13

Slide 13 text

« 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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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 »

Slide 17

Slide 17 text

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 »

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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.»

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

Dans WordPress, ça donne quoi ?

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Décortiquons la base de données de WordPress

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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 »

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Décortiquons la base de données de WordPress

Slide 30

Slide 30 text

Décortiquons la base de données de WordPress Ce n’est pas une clé étrangère

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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é

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

É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

Slide 36

Slide 36 text

Étudions une requête WordPress en détail

Slide 37

Slide 37 text

É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)

Slide 38

Slide 38 text

Étudions une requête WordPress en détail

Slide 39

Slide 39 text

Étudions une requête WordPress en détail Rapide ? 😏

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

Créez vos tables wp_posts c’est pour les articles

Slide 42

Slide 42 text

Créez vos tables wp_posts c’est pour les articles et uniquement pour les articles « Basique, Simple »

Slide 43

Slide 43 text

Même exemple avec ma table wp_article + wp_articlemeta (c’est pas top mais mieux structuré)

Slide 44

Slide 44 text

É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 !

Slide 45

Slide 45 text

Étudions une requête WordPress en détail

Slide 46

Slide 46 text

Étudions une requête WordPress en détail

Slide 47

Slide 47 text

Comparatif +135% x2,4

Slide 48

Slide 48 text

Comparatif En moyenne, on est souvent à +50% pour 2 fois plus de données +135% x2,4

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

• 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 »

Slide 51

Slide 51 text

• 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 »

Slide 52

Slide 52 text

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)

Slide 53

Slide 53 text

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 »

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Merci à tous