Au début de chaque page servie par WordPress, il y a un appel MySQL pour récupérer les options:
SELECT option_name, option_value FROM wp_options WHERE autoload = 'yes';
Parce qu'il n'y a pas d'index sur la autoload
colonne, MySQL doit rechercher TOUTES les lignes.
Je suis également tombé sur le commentaire de cette réponse disant qu'il n'y aurait pas de gain de performance même s'il y avait un indice.
Dans mon application, j'ai utilisé beaucoup de valeurs transitoires pour servir de remplacement de session. Ils ont très bien fonctionné et j'ai mes propres routines de collecte des ordures. J'ai remarqué que dans le wp_options
tableau, mes valeurs transitoires (celles commençant par _transient_
) ont toutes autoload=no
. Je m'attends à ce que le nombre de lignes de ma wp_options
table augmente à mesure que le nombre d'utilisateurs simultanés augmente.
Je voudrais savoir pourquoi la table est conçue de cette façon. Et dois-je créer un index pour mon cas particulier?
la source
autoload
colonne.wp_options.autoload
. Sources: make.wordpress.org/core/2019/10/15/… ... et ... core.trac.wordpress.org/ticket/24044#comment:87 ... Félicitations à @DanBUK qui a proposé cette fonctionnalité en 2013.J'exécute 3 blogs WP sur une grande instance de Debian Squeeze et j'explorais pourquoi mysql était bloqué sur cet hôte à 200% d'utilisation du processeur et à la charge du système entre 3 et 6. En regardant une 'liste de processus' dans mysql, nous avons compris le La table wp_option était impliquée dans ce problème, nous avons donc exécuté:
Après cette opération, la charge mysql, comme indiqué en haut, est tombée à 1% et la charge moyenne de l'instance est désormais de 0,10.
Nous utilisons certains plugins donc il pourrait y avoir une boucle quelque part dans le code, et cela pourrait être une situation particulière, mais dans notre cas, le changement de performances est tout à fait étonnant.
Notre table wp_options contient 347 lignes.
la source
select *
une fois pour toutes. Au lieu de cela, c'est une requête pour chaque option, c'est pourquoi mettre un index fera une grande différence.Alors que @fuxia a accepté la réponse, elle touche à certaines raisons "revendiquées" (dont la plupart ont été revendiquées par des employés d'Automattic sur divers tickets Trac, etc.), la raison sous - jacente pour que WordPress Core n'inclue pas d'index pour les options de chargement automatique dans le
wp_options
tableau est que Automattic craignait que cela n'ait un impact négatif sur les performances des bases de données MySQL qui utilisaient toujours le moteur MyISAM.Plus précisément, ils ont souligné le site Web WordPress.org lui-même, étant une base de données très ancienne / complexe, comme un exemple de site Web dont les performances seraient affectées par un tel index.
Presque toutes les autres raisons de ne pas ajouter l'indice depuis 9 ans (oui, depuis 2010 pour le ticket Trac # 14258 et depuis 2013 pour le ticket Trac # 24044 ) ont été à plusieurs reprises prouvées incorrectes par des dizaines de membres du Communauté WordPress, mais les employés d'Automattic impliqués ont ignoré à plusieurs reprises plusieurs tests de référence indépendants et sont revenus à mentionner les préoccupations de MyISAM.
Heureusement, fin 2019 avec PHP 7.2 maintenant la version "par défaut" recommandée par WordPress Core, et avec le moteur InnoDB désormais par défaut dans les versions de MySQL après 5.5 , et avec la pression continue de divers développeurs dont @DanBUK qui est resté sur la question pendant des années , Automattic a finalement cédé et a décidé d'ajouter l'index de chargement automatique à partir de WordPress 5.3+ en novembre 2019.
Chez LittleBizzy, nous avions lancé le premier plugin connu qui ajoutait automatiquement l'index s'il n'existait pas, qui est toujours disponible sur GitHub et téléchargé régulièrement. Veuillez noter que vous n'avez plus besoin d'installer de tels plugins sur votre pile WordPress si vous exécutez WP Core 5.3 + ...
la source