Wordpress, WooCommerce - сохранить продукт очень медленно - PullRequest
0 голосов
/ 27 января 2019

Некоторые продукты сохраняются очень медленно (30 секунд)

Вот снимок экрана от профилировщика:

enter image description here

Я включил Slow Query log в mysql и нашел этот запрос:

SELECT COUNT( DISTINCT ID )
FROM wpmf_posts p
LEFT JOIN (

SELECT object_id
FROM wpmf_term_relationships
WHERE term_taxonomy_id
IN ( 7 )
) AS exclude_join ON exclude_join.object_id = p.ID
INNER JOIN (

SELECT object_id
FROM wpmf_term_relationships
INNER JOIN wpmf_term_taxonomy
USING ( term_taxonomy_id )
WHERE term_id
IN ( 4246, 4247, 4254, 4257, 4263, 4280, 4290, 4335, 4375, 4397, 4486, 5114 )
) AS include_join ON include_join.object_id = p.ID
WHERE 1 =1
AND p.post_status =  'publish'
AND p.post_type =  'product'
AND exclude_join.object_id IS NULL
LIMIT 0 , 30

, который возвращает 4799 и занимает 27 секунд:

# Time: 190127  8:38:29
# User@Host: lfytcoil_uprdb[lfytcoil_uprdb] @ localhost []
# Query_time: 27.287704  Lock_time: 0.000076 Rows_sent: 1  Rows_examined: 483196982

Любая идея, какова цель этого запроса?

Это wpmf_term_taxonomy с идентификатором product_visibility

count показывает 31234

Это сайт WooCommerce с 10717 товарами,

Я подозреваю, что WooCommerce слишком много продуктов для обработки.

ПРИМЕЧАНИЕ: после запуска delete FROM wpmf_term_relationships where term_taxonomy_id = 7, который удалил 31234, сохранение займет всего 2 сек. Мой вопрос:

  1. Разве WooCommerce не может обработать 10717 товаров?

  2. Есть ли способ как-то улучшить save?например, отключив этот запрос?или путем кеширования результата?или улучшить структуру БД?или установить какие-нибудь умные модули?

  3. Я замечаю звонок на wp_update_term_count, кажется, что если я отключу этот звонок, то проблема будет решена, какие могут быть побочные эффектыэто?

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

ПРИМЕЧАНИЕ: мой предыдущий ответ неверен

Я обнаружил, что вы можете отложить подсчет сроков, добавив

    wp_defer_term_counting(true);

перед операцией save (т.е. в начале скрипта)

Чем

    wp_defer_term_counting(false);

в конце сценария, который также запускает термин count

0 голосов
/ 29 января 2019

Решение объясняется в этом вопросе:

https://github.com/woocommerce/woocommerce/issues/14900

вы должны заменить файл includes/wc-term-functions.php

с этим:

https://raw.githubusercontent.com/woocommerce/woocommerce/ec489ce1a0c9030a73080ada28f25162f441dfdb/includes/wc-term-functions.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...