@GeKskill

SQL запрос к БД через WordPress в 46 раз дольше чем через phpmyadmin?

Вот такой запрос через $wpdb->get_col() выполняется 0,69s, а напрямую в phpmyadmin 0.0149s. В чем тут может быть дело?
SELECT DISTINCT tt.term_id FROM wp_term_relationships AS tr JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN wp_terms AS t ON tt.term_id = t.term_id WHERE tr.object_id IN ( SELECT p.ID FROM wp_posts AS p JOIN wp_term_relationships AS tr ON p.ID = tr.object_id JOIN wp_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id JOIN wp_terms AS t ON tt.term_id = t.term_id WHERE p.post_type = 'product' AND p.post_status = 'publish' AND tt.taxonomy = 'product_cat' AND t.term_id = '2961' ) AND tt.taxonomy LIKE 'pa_%';
  • Вопрос задан
  • 150 просмотров
Решения вопроса 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Во первых нужно нормально писать запрос, хотя бы для понимания что вы делаете:
SELECT DISTINCT tt.term_id 
FROM wp_term_relationships AS tr 
JOIN wp_term_taxonomy AS tt 
ON tr.term_taxonomy_id = tt.term_taxonomy_id 
JOIN wp_terms AS t 
ON tt.term_id = t.term_id 
WHERE tr.object_id IN (
   SELECT p.ID 
   FROM wp_posts AS p 
   JOIN wp_term_relationships AS tr 
   ON p.ID = tr.object_id 
   JOIN wp_term_taxonomy AS tt 
   ON tr.term_taxonomy_id = tt.term_taxonomy_id 
   JOIN wp_terms AS t 
   ON tt.term_id = t.term_id 
   WHERE p.post_type = 'product' 
   AND p.post_status = 'publish' 
   AND tt.taxonomy = 'product_cat' 
   AND t.term_id = '2961' 
) 
AND tt.taxonomy LIKE 'pa_%';

Во вторых, как уже написали, это старая "проблема", пхпмайадмин выдает результат "порциями" и большинство малоопытных разработчиков не обращают внимание на отображаемый в результатах запрос, где этот лимит отображен.

Ну и в третьих, запросы без лимита почти всегда будут медленными, так как бд вынуждена перебирать все таблицы перебором. Если же такой запрос необходим по каким то причинам, то стоит посмотреть что же происходит с запросом. Нужно в первую очередь сделать отдельно вложенный запрос, проверить как он работает, оптимизировать, а затем то же самое сделать с внешним. Так же неплохо прогнать эти запросы через explain, посмотреть каких индексов не хватает. Ну и первое на что стоит обратить внимание это tt.taxonomy LIKE 'pa_%', что само по себе затратно, и требует обязательного индекса.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы