Tipps zur Verbesserung der Abfragegeschwindigkeit von WooCommerce-Mitgliedern: Optimieren Sie den MySQL-Index
P粉333186285
2023-08-26 11:09:08
<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>
那个插件应该对一些查询有帮助。
这可能对
wp_posts
有帮助至于在一个表上有多个索引...不同的查询需要不同的索引。MySQL在每个表引用中只使用一个索引[很少例外]。在你的查询中实际上有3个查询,一个是针对posts,另外两个是针对postmeta。
你提供的
EXPLAIN
似乎不一致。请提供两个表的SHOW CREATE TABLE
,这样我可以弄清楚发生了什么(并更好地回答Oliver的问题)。INDEX
中的列的顺序很重要;在WHERE
子句中的顺序则不重要。查询中有两个有问题的地方;避免它们可能有助于性能:
CONCAT
和OR
。这是OR
:没有索引可以帮助。但是,由于应用程序的需求,可能无法改进它。