Petua untuk meningkatkan kelajuan pertanyaan ahli WooCommerce: Optimumkan indeks MySQL
P粉333186285
2023-08-26 11:09:08
<p>Saya mempunyai tapak web berasaskan keahlian WooCommerce menggunakan sambungan keahlian Teams for WooCommerce. Walaupun mempunyai pangkalan pengguna yang besar (>70,000 pengguna), ia menunjukkan prestasi yang sangat baik 95% pada setiap masa. Kami menerima kira-kira 10,000 lawatan setiap hari dengan masa respons di bawah satu saat. </p>
<p>Semasa musim puncak apabila pengguna perlu melengkapkan latihan, tapak mungkin ranap disebabkan oleh beban permintaan tidak dicache serentak. </p>
<p>Menggunakan alat Pemantau Pertanyaan, satu pertanyaan menarik perhatian kami: 0.0375 saat (purata kurang daripada 0.0050 saat). Pertanyaan ini menyemak perkara berikut: </p>
<ol>
<li><p>Adakah pengguna semasa ahli pasukan dengan langganan aktif? </p>
</li>
<li><p>Adakah mereka mempunyai kebenaran untuk melihat artikel ini? </p>
</li>
</ol>
<p>Berikut ialah pertanyaan itu sendiri: </p>
<pre class="brush:php;toolbar:false;">SELECT wp_posts.*
DARIPADA wp_posts
KIRI SERTAI wp_postmeta _teams_pm
PADA wp_posts.ID = _team_pm.post_id
DAN _teams_pm.meta_key = '_id_ahli'
DAN _team_pm.meta_value = 2
KIRI SERTAI wp_usermeta_teams_um
ON _teams_um.user_id = _teams_pm.meta_value
DAN _teams_um.meta_key = CONCAT( '_wc_memberships_for_teams_team_', wp_posts.ID, '_role' )
DI MANA 1=1
DAN ((wp_posts.post_type = 'wc_memberships_team'
DAN (wp_posts.post_status = 'terbitkan'
ATAU wp_posts.post_status = 'acf-disabled'
ATAU wp_posts.post_status = 'peribadi')))
DAN (_teams_um.meta_value IN('manager', 'member')
ATAU wp_posts.post_author = 2 )
PESANAN OLEH wp_posts.post_date DESC</pre>
<p>Ia dipanggil oleh: </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->__build()
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>Adakah sesiapa mempunyai sebarang idea untuk mengindeks cara mempercepatkan pertanyaan ini? Saya tidak cukup mahir dengan SQL untuk mengetahui di mana peletakan indeks terbaik. </p>
<p>Kami menjangkakan peningkatan yang besar pada hari Isnin, jadi saya berharap untuk bersedia pada hujung minggu ini apabila tapak lebih senyap.</p>
<p>Terima kasih terlebih dahulu! </p>
<p>EDIT: Output menerangkan, awalan dan nama pangkalan data tanpa nama: </p>
<pre class="brush:php;toolbar:false;">+----+-------------+------------ -----------------------------+---------------------- ---- ----+-------------------+---------+------------ ---- ------------------------------+------+------- ---+- ------------------------------------------ --+
|. pilih_jenis |
+----+-------------+--------------+--------------- -+- -------+---------------------------------+------ ------ ------+---------+-------------------------- ------- -------------+------+----------+----------- ------- ----------------------------+
|. |. wp_posts |
|. _team_pm |
|. _team_um |
+----+-------------+--------------+--------------- -+- -------+---------------------------------+------ ------ ------+---------+-------------------------- ------- -------------+------+----------+----------- ------- ----------------------------+
3 baris dalam set, 4 amaran (0.00 saat)</pra>
<p><br /></p>
Pemalam itu sepatutnya membantu dengan beberapa pertanyaan.
Ini mungkin membantu
Bagi mempunyai berbilang indeks di atas meja...pertanyaan yang berbeza memerlukan indeks yang berbeza. MySQL hanya menggunakan satu indeks setiap rujukan jadual [dengan pengecualian yang jarang berlaku]. Sebenarnya terdapat 3 pertanyaan dalam pertanyaan anda, satu untuk siaran dan dua untuk postmeta.wp_posts
supaya saya dapat mengetahui perkara yang sedang berlaku (dan lebih baik menjawab soalan Oliver).
EXPLAIN
似乎不一致。请提供两个表的SHOW CREATE TABLE
Susunan dalam klausatidak penting.
Terdapat dua tempat bermasalah dalam pertanyaan; mengelakkannyaINDEX
中的列的顺序很重要;在WHERE
mungkin membantu prestasi: :
Tiada indeks boleh membantu. Walau bagaimanapun, ia mungkin tidak dapat diperbaiki kerana keperluan aplikasi.CONCAT
和OR
。这是OR