Почему этот запрос WordPress mysql намного быстрее?(иначе объясняя объяснение) - PullRequest
1 голос
/ 06 июня 2019

Может кто-нибудь помочь мне понять, почему второй запрос намного быстрее?

Это из базы данных WordPress, где wp_posts - это таблица со столбцами ID, post_title, post_status..., а wp_postmeta - это таблица со столбцами ID, post_id, meta_key, meta_value.wp_posts.ID соответствует wp_postmeta.post_id.

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

Мне бы очень хотелось понять, поэтому я знаю, если этоприменимо к другим запросам.

Спасибо!


Запрос 1 :: ~ 14сек

SELECT
    COALESCE( SUM( wpm1.meta_value ), 0  ) as package_sum,
    wpm2.meta_value as prp_id
FROM wp_posts
LEFT JOIN wp_postmeta wpm1 ON wpm1.post_id = wp_posts.ID
LEFT JOIN wp_postmeta wpm2 ON wpm2.post_id = wp_posts.ID
LEFT JOIN wp_postmeta wpm3 ON wpm3.post_id = wp_posts.ID
WHERE post_type='voucher'
AND post_status IN ( 'requested', 'disputed', 'issued', 'visit-required', 'claimed', 'witheld', 'approved', 'paid' )
AND wpm1.meta_key='voucher_value'
AND wpm2.meta_key='prp'
AND wpm3.meta_key='supplier'
AND wpm3.meta_value='955'
GROUP BY wpm2.meta_value

EXPLAIN:
-----------------------
id   select_type     table       type        possible_keys               key         key_len     ref                     rows    filtered    Extra
1    SIMPLE          wpm2        ref         post_id,meta_key            meta_key    767         const                   80212   100.00      Using where; Using temporary; Using filesort
1    SIMPLE          wp_posts    eq_ref      PRIMARY,type_status_date    PRIMARY     8           gigabit.wpm2.post_id    1       100.00      Using where
1    SIMPLE          wpm3        ref         post_id,meta_key            post_id     8           gigabit.wpm2.post_id    50      100.00      Using where
1    SIMPLE          wpm1        ref         post_id,meta_key            post_id     8           gigabit.wpm2.post_id    50      100.00      Using where

Запрос 2 :: ~ 3.0сек

SELECT
    COALESCE( SUM( wpm1.meta_value ), 0  ) as package_sum,
    wpm2.meta_value as prp_id
FROM wp_posts
LEFT JOIN wp_postmeta wpm1 ON wpm1.post_id = wp_posts.ID AND wpm1.meta_key='voucher_value'
LEFT JOIN wp_postmeta wpm2 ON wpm2.post_id = wp_posts.ID AND wpm2.meta_key='prp'
LEFT JOIN wp_postmeta wpm3 ON wpm3.post_id = wp_posts.ID AND wpm3.meta_key='supplier'
WHERE post_type='voucher'
AND post_status IN ( 'requested', 'disputed', 'issued', 'visit-required', 'claimed', 'witheld', 'approved', 'paid' )
AND wpm3.meta_value='955'
GROUP BY wpm2.meta_value

EXPLAIN:
-----------------------
id   select_type     table       type        possible_keys               key         key_len     ref                     rows    filtered    Extra
1    SIMPLE          wpm3        ref         post_id,meta_key            meta_key    767         const                   71970   100.00      Using where; Using temporary; Using filesort
1    SIMPLE          wp_posts    eq_ref      PRIMARY,type_status_date    PRIMARY     8           gigabit.wpm3.post_id    1       100.00      Using where
1    SIMPLE          wpm1        ref         post_id,meta_key            post_id     8           gigabit.wpm3.post_id    50      100.00      Using where
1    SIMPLE          wpm2        ref         post_id,meta_key            post_id     8           gigabit.wpm3.post_id    50      100.00      Using where
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...