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>