Maison  >  Questions et réponses  >  le corps du texte

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>
P粉333186285P粉333186285421 Il y a quelques jours569

répondre à tous(1)je répondrai

  • P粉155710425

    P粉1557104252023-08-27 09:51:24

    Ce plugin devrait aider avec certaines requêtes.

    Cela peut être utilewp_posts

    INDEX(post_type, post_status, post_author, ID, post_date)

    Quant à avoir plusieurs index sur une table... différentes requêtes nécessitent des index différents. MySQL n'utilise qu'un seul index par référence de table [à de rares exceptions près]. Il y a en fait 3 requêtes dans votre requête, une pour les publications et deux pour postmeta.

    Fourni par vous

    pour que je puisse comprendre ce qui se passe (et mieux répondre à la question d'Oliver). EXPLAIN似乎不一致。请提供两个表的SHOW CREATE TABLE L'ordre dans les clauses

    n'est pas important. INDEX中的列的顺序很重要;在WHERE

    Il y a deux endroits problématiques dans la requête ; les éviter

    pourrait améliorer les performances :  : CONCATOR。这是OR

    AND ( _teams_um.meta_value    IN('manager', 'member')
          OR wp_posts.post_author = 2 )

    Aucun index ne peut aider. Cependant, il se peut qu'il ne soit pas possible de l'améliorer en raison des exigences de l'application.

    répondre
    0
  • Annulerrépondre