suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Tipps zur Verbesserung der Abfragegeschwindigkeit von WooCommerce-Mitgliedern: Optimieren Sie den MySQL-Index

<p>Ich habe eine auf WooCommerce-Mitgliedschaft basierende Website, die die Mitgliedschaftserweiterung „Teams für WooCommerce“ verwendet. Trotz einer riesigen Benutzerbasis (>70.000 Benutzer) funktioniert es in 95 % der Fälle sehr gut. Wir erhalten etwa 10.000 Besuche pro Tag mit Reaktionszeiten von unter einer Sekunde. </p> <p>Während der Hauptsaison, wenn Benutzer eine Schulung absolvieren müssen, kann die Website aufgrund der Vielzahl gleichzeitiger, nicht zwischengespeicherter Anfragen abstürzen. </p> <p>Mit dem Query Monitor-Tool erregte eine Abfrage unsere Aufmerksamkeit: 0,0375 Sekunden (durchschnittlich weniger als 0,0050 Sekunden). Diese Abfrage prüft Folgendes: </p> <ol> <li><p>Ist der aktuelle Benutzer Mitglied eines Teams mit einem aktiven Abonnement? </p> </li> <li><p>Haben sie die Berechtigung, diesen Artikel anzuzeigen? </p> </li> </ol> <p>Hier ist die Abfrage selbst: </p> <pre class="brush:php;toolbar:false;">SELECT wp_posts.* VON wp_posts LINKS BEITRETEN wp_postmeta _teams_pm ON wp_posts.ID = _teams_pm.post_id UND _teams_pm.meta_key = '_member_id' UND _teams_pm.meta_value = 2 LINKS BEITRETEN wp_usermeta_teams_um ON _teams_um.user_id = _teams_pm.meta_value AND _teams_um.meta_key = CONCAT( '_wc_memberships_for_teams_team_', wp_posts.ID, '_role' ) WO 1=1 UND ((wp_posts.post_type = 'wc_memberships_team' UND (wp_posts.post_status = 'veröffentlichen' ODER wp_posts.post_status = 'acf-disabled' ODER wp_posts.post_status = 'private'))) AND (_teams_um.meta_value IN('manager', 'member') ODER wp_posts.post_author = 2 ) ORDER BY wp_posts.post_date DESC</pre> <p>Es wird aufgerufen durch: </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>Hat jemand eine Idee zur Indizierung, wie diese Abfrage beschleunigt werden kann? Ich kenne mich mit SQL nicht gut genug aus, um zu wissen, wo die beste Indexplatzierung ist. </p> <p>Wir rechnen mit einem starken Anstieg am Montag, daher hoffe ich, dass ich an diesem Wochenende vorbereitet bin, wenn es auf der Baustelle ruhiger ist.</p> <p>Vielen Dank im Voraus! </p> <p>EDIT: Ausgabe von EXPLAIN, Präfix und Datenbankname anonymisiert: </p> <pre class="brush:php;toolbar:false;">+----+-------------+------------- ---+----------------+---------------------+--------------------- ---- ----+----+---------+------------ ---- ----------------+------+------- ---+- --------------------------------------------- --+ |. id_type |. key_len | +----+-------------+--------------+--------------- -+- ------+-------------------+------ ------ ------+---------+--------------------------- ------- -------------+------+----------+----------- ------- ------------+ |. 100.00 |. wp_posts | |. _teams_pm |. PRIMARY,meta_posts.ID | |. _teams_um |. PRIMARY 1030 | +----+-------------+--------------+--------------- -+- ------+-------------------+------ ------ ------+---------+--------------------------- ------- -------------+------+----------+----------- ------- ------------+ 3 Reihen im Satz, 4 Warnungen (0,00 Sek.)</pre> <p><br /></p>
P粉333186285P粉333186285455 Tage vor606

Antworte allen(1)Ich werde antworten

  • P粉155710425

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

    那个插件应该对一些查询有帮助。

    这可能对wp_posts有帮助

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

    至于在一个表上有多个索引...不同的查询需要不同的索引。MySQL在每个表引用中只使用一个索引[很少例外]。在你的查询中实际上有3个查询,一个是针对posts,另外两个是针对postmeta。

    你提供的EXPLAIN似乎不一致。请提供两个表的SHOW CREATE TABLE,这样我可以弄清楚发生了什么(并更好地回答Oliver的问题)。

    INDEX中的列的顺序很重要;在WHERE子句中的顺序则不重要。

    查询中有两个有问题的地方;避免它们可能有助于性能:CONCATOR。这是OR

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

    没有索引可以帮助。但是,由于应用程序的需求,可能无法改进它。

    Antwort
    0
  • StornierenAntwort