Conseils pour améliorer la vitesse des requêtes des membres WooCommerce : optimiser l'index MySQL
<p>J'ai un site Web basé sur l'adhésion à WooCommerce utilisant l'extension d'adhésion Teams pour WooCommerce. Malgré une énorme base d'utilisateurs (> 70 000 utilisateurs), il fonctionne très bien 95 % du temps. Nous recevons environ 10 000 visites par jour avec des temps de réponse inférieurs à une seconde. </p>
<p>Pendant les hautes saisons, lorsque les utilisateurs doivent suivre une formation, le site peut planter en raison de la charge de requêtes simultanées non mises en cache. </p>
<p>Grâce à l'outil Query Monitor, une requête a retenu notre attention : 0,0375 seconde (moyenne inférieure à 0,0050 seconde). Cette requête vérifie les éléments suivants : </p>
<ol>
<li><p>L'utilisateur actuel est-il membre d'une équipe avec un abonnement actif ? </p>
≪/li>
<li><p>Est-il autorisé à consulter cet article ? </p>
≪/li>
</ol>
<p>Voici la requête elle-même : </p>
<pre class="brush:php;toolbar:false;">SELECT wp_posts.*
DE wp_posts
REJOINDRE À GAUCHE wp_postmeta _teams_pm
SUR wp_posts.ID = _teams_pm.post_id
ET _teams_pm.meta_key = '_member_id'
ET _teams_pm.meta_value = 2
REJOINDRE À GAUCHE wp_usermeta_teams_um
SUR _teams_um.user_id = _teams_pm.meta_value
ET _teams_um.meta_key = CONCAT( '_wc_memberships_for_teams_team_', wp_posts.ID, '_role' )
OÙ 1=1
ET ((wp_posts.post_type = 'wc_memberships_team'
ET (wp_posts.post_status = 'publier'
OU wp_posts.post_status = 'acf-disabled'
OU wp_posts.post_status = 'privé')))
AND (_teams_um.meta_value IN('manager', 'membre')
OU wp_posts.post_author = 2 )
COMMANDE PAR wp_posts.post_date DESC</pre>
<p>Il est appelé par : </p>
<pre class="brush:php;toolbar:false;">"WP_Query->get_posts()
wp-includes/class-wp-query.php:3111
WP_Query->query()
wp-includes/class-wp-query.php:3542
WP_Query->__construct()
wp-includes/class-wp-query.php:3653
SkyVergeWMTTeams_Handler->get_teams()
wp-content/plugins/woocommerce-memberships-for-teams/src/Teams_Handler.php:446
wc_memberships_for_teams_get_teams()
wp-content/plugins/woocommerce-memberships-for-teams/src/Functions/Teams.php:100
ctz_membership_get_user_team_id()
wp-content/plugins/core-functionality/temp/wc_teams.php:603"</pre>
<p> Quelqu'un a-t-il des idées sur l'indexation pour accélérer cette requête ? Je ne connais pas suffisamment SQL pour savoir où se trouve le meilleur placement d'index. </p>
<p>Nous nous attendons à un gros pic lundi, j'espère donc être prêt ce week-end lorsque le site sera plus calme.</p>
<p>Merci d'avance ! </p>
<p>EDIT : sortie de l'explication, du préfixe et du nom de la base de données anonymisés : </p>
<pre class="brush:php;toolbar:false;">+----+-------------+------------- --+----------------+-------+---------------------- ---- ----+--------+---------+------------ ---- -------------------------------+------+------- ---+- --------------------------------------------- ---+
| identifiant | select_type table | partitions | clé_possible | lignes |
+---------+--------+--------------+--------------- -+- ------+---------------------------------+------ ------ ------+---------+-------------------------------- ------- -------------+------+----------+--------------- ------- --------------------------+
| 1 | SIMPLE | wp_posts | NULL | type_status_date, post_author | type_status_date |
| 1 | SIMPLE | _teams_pm | NULL | PRIMARY,meta_value |
| 1 | SIMPLE | _teams_um | NULL | PRIMARY, meta_key | PRIMARY |
+---------+--------+--------------+--------------- -+- ------+---------------------------------+------ ------ ------+---------+-------------------------------- ------- -------------+------+----------+--------------- ------- --------------------------+
3 lignes dans un ensemble, 4 avertissements (0,00 sec)</pre>
<p><br /></p>