Повышение скорости mySQL Запрос с подзапросом и LIMIT / OFFSET - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь повысить скорость моего запроса. Загрузка занимает 30 секунд, несмотря на то, что я ОГРАНИЧИЛ его до 12. Я использую подзапрос, чтобы получить все компании, использующие текущие выбранные данные, и упорядочить их по наибольшему количеству компаний. Вот мой запрос ниже. И если я добавлю конкретный c запрос. Пример запроса = тест Это быстрее.

<code>$get_query = isset($_REQUEST['query']) ? $_REQUEST['query'] : '';           
$get_all_vendors = $wpdb->get_results( "SELECT tbl1.ID 
AS vendor_id, tbl1.post_title AS vendor_name,

(SELECT COUNT(*) AS total_companies
FROM {$wpdb->prefix}posts tbl2 

LEFT JOIN {$wpdb->prefix}postmeta as tbl3 ON tbl2.ID=tbl3.post_id AND tbl3.meta_key = 'vendor-ap'           
LEFT JOIN {$wpdb->prefix}postmeta as tbl4 ON tbl2.ID=tbl4.post_id AND tbl4.meta_key = 'vendor-as'
LEFT JOIN {$wpdb->prefix}postmeta as tbl5 ON tbl2.ID=tbl5.post_id AND tbl5.meta_key = 'vendor-data'
LEFT JOIN {$wpdb->prefix}postmeta as tbl6 ON tbl2.ID=tbl6.post_id AND tbl6.meta_key = 'vendor-management'
LEFT JOIN {$wpdb->prefix}postmeta as tbl7 ON tbl2.ID=tbl7.post_id AND tbl7.meta_key = 'vendor-sr'
LEFT JOIN {$wpdb->prefix}postmeta as tbl8 ON tbl2.ID=tbl8.post_id AND tbl8.meta_key = 'vendor-ae'

WHERE (tbl2.post_type = 'company-stacks' 
AND tbl2.post_status = 'publish')
AND tbl3.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')
OR tbl4.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl5.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl6.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl7.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl8.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') ) AS featured_stackies

FROM {$wpdb->prefix}posts tbl1 
WHERE tbl1.post_type = 'vendor-stacks' 
AND tbl1.post_status = 'publish' 
AND tbl1.post_title LIKE '%".$get_query."%'

GROUP BY tbl1.ID ORDER BY featured_stackies DESC LIMIT 12 OFFSET 0", OBJECT);

echo '<pre>';
    print_r($get_all_vendors);
echo '
';

Прямо сейчас у меня есть 290 строк в базе данных.

Обновлено Я думаю, что причиной медленной загрузки запроса является ORDER BY featured_stackies

1 Ответ

1 голос
/ 03 апреля 2020

В соответствии с MySQL архитектурой и принципами оптимизации скорости

запрос JOIN как подзапрос не является хорошей практикой

попытаться напрямую присоединиться к основному запросу

Ваш текущий запрос пытается выполнить

enter image description here

таблица posts и postmeta объединены с шестью объединениями, объединить его как часть основной запрос, причина в том, что основной запрос также выполняет выборку на posts таблице

Может быть, вы можете попробовать это

SELECT 
tbl1.ID AS vendor_id, 
tbl1.post_title AS vendor_name,
COUNT(tbl1.ID) AS featured_stackies
FROM {$wpdb->prefix}posts tbl1
LEFT JOIN {$wpdb->prefix}postmeta as tbl3 ON tbl1.ID=tbl3.post_id AND tbl3.meta_key = 'vendor-ap'           
LEFT JOIN {$wpdb->prefix}postmeta as tbl4 ON tbl1.ID=tbl4.post_id AND tbl4.meta_key = 'vendor-as'
LEFT JOIN {$wpdb->prefix}postmeta as tbl5 ON tbl1.ID=tbl5.post_id AND tbl5.meta_key = 'vendor-data'
LEFT JOIN {$wpdb->prefix}postmeta as tbl6 ON tbl1.ID=tbl6.post_id AND tbl6.meta_key = 'vendor-management'
LEFT JOIN {$wpdb->prefix}postmeta as tbl7 ON tbl1.ID=tbl7.post_id AND tbl7.meta_key = 'vendor-sr'
LEFT JOIN {$wpdb->prefix}postmeta as tbl8 ON tbl1.ID=tbl8.post_id AND tbl8.meta_key = 'vendor-ae'
WHERE tbl1.post_type = 'vendor-stacks' 
AND tbl1.post_status = 'publish' 
AND tbl1.post_title LIKE '%".$get_query."%'
AND ( tbl1.post_type = 'company-stacks' 
AND tbl1.post_status = 'publish')
AND tbl3.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')
OR tbl4.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl5.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl6.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl7.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%') 
OR tbl8.meta_value LIKE CONCAT('%\"',tbl1.ID, '\"%')

GROUP BY tbl1.ID ORDER BY featured_stackies DESC LIMIT 12 OFFSET 0

Приведенный выше запрос сделает обработку простой, как показано ниже

enter image description here

Также измените порядок условия WHERE на основе приведенного ниже правила

Оптимизация 1:

какой ключ или первичный ключ в WHERE уменьшит данные до минимума, а затем перенесет это сравнение на передний план в последовательности условий сравнения

Например, : tbl1.post_type = 'vendor-stacks' AND tbl1.post_status = 'publish' AND tbl1.post_type = 'company-stacks'

, если company-stacks собирается сделать вашу 200-ю дату 10, измените последовательность на

tbl1.post_type = 'company-stacks' AND tbl1.post_status = 'publish' AND tbl1.post_type = 'vendor-stacks'

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