Оптимизация внутреннего соединения

Мне нужна помощь в оптимизации запроса. У меня есть запрос, который занимает слишком много времени для выполнения 12 секунд, и мне бы хотелось, чтобы мне оказали помощь в его оптимизации, поскольку я не гуру sql. Вот :

SELECT   ID                                          ,
         user_login                                  ,
         user_nicename                               ,
         user_registered                             ,
         user_status                                 ,
         display_name                                ,
         t1.meta_value             AS account_type    ,
         1 t2.meta_value           AS views           ,
         GROUP_CONCAT(t4.term_id)  AS interests_skills,
         GROUP_CONCAT(t4.taxonomy) AS taxonomyComb    ,
         t4.term_id                                   ,
         t4.taxonomy
FROM     wp_users
         INNER JOIN wp_usermeta AS t1
         ON       (
                           t1.user_id = wp_users.ID
                  AND
                           (
                                    t1.meta_key   = 'account_type'
                           AND      t1.meta_value = 'individual'
                           )
                  )
         LEFT JOIN wp_usermeta AS t2
         ON       (
                           t2.user_id  = wp_users.ID
                  AND      t2.meta_key = 'views'
                  )
         LEFT JOIN wp_term_relationships AS t3
         ON       (
                           t3.object_id = (1000000+wp_users.ID)
                  )
         INNER JOIN wp_term_taxonomy AS t4
         ON       (
                           (
                                    t3.term_taxonomy_id = t4.`term_taxonomy_id`
                           AND      t4.taxonomy         = 'category'
                           AND      t4.term_id IN (396,410,411,416,142,417)
                           )
                  OR
                           (
                                    t3.term_taxonomy_id = t4.`term_taxonomy_id`
                           AND      t4.taxonomy         = 'skill'
                           AND      t4.term_id IN (461,463,464,466,490,468,470,491,473,474,475)
                           )
                  )
WHERE    t4.term_id IS NOT NULL
GROUP BY ID LIMIT 0,10

Вот объяснение

1 ПРОСТОЙ t4 диапазон ПЕРВИЧНЫЙ, term_id_taxonomy, таксономия term_id_taxonomy 106 NULL 17 Использование where; Использование временных; Использование файловой сортировки

1 SIMPLE t1 ref user_id, meta_key meta_key 768 const 3773 Использование where

1 ПРОСТОЙ wp_users eq_ref ПЕРВИЧНЫЙ 8 jasper_gi.t1.user_id 1

1 ПРОСТОЙ t2 ref user_id, meta_key meta_key 768 const 2

1 ПРОСТОЙ t3 eq_ref PRIMARY, term_taxonomy_id PRIMARY 16 func, jasper_gi.t4.term_taxonomy_id 1 Использование where; Использование индекса


person Raptor235    schedule 08.12.2010    source источник
comment
Исправил форматирование запроса. Глядя на историю редактирования, я мог бы случайно удалить предложение, если бы вы этого не сделали! Пожалуйста, проверьте и добавьте его повторно, если необходимо.   -  person Martin Smith    schedule 08.12.2010


Ответы (3)


Мне нравится макет вашего SQL - очень легко читать.

Всякий раз, когда у меня возникает такая проблема, я стараюсь ее решить. Начните с базовой таблицы без всех объединений и посмотрите, как она работает - посмотрите план запроса, проверьте результаты и т. Д.

Затем добавляйте каждое соединение по одному, пока не увидите виновника. Может быть смесь нескольких, может быть несколько отсутствующих индексов и т. Д. Но, систематически работая с подобными объединениями, вы можете найти проблемные места и лучше понять, что делать.

person n8wrl    schedule 08.12.2010

Первая линия атаки направлена ​​на индексы: есть ли у вас составные индексы, определенные для:

t2/wp_usermeta: (user_id, meta_key)
t3/wp_term_relationships: (objectid)
t4/wp_term_taxonomy: (term_taxonomy_id, taxonomy, term_id)

?

person littlegreen    schedule 08.12.2010

Наличие индексов в ваших полях соединения несколько поможет:

  • wp_usermeta.user_id
  • wp_users.ID
  • wp_term_relationships.objectid
  • wp_term_taxonomy.term_taxonomy_id
  • wp_term_taxonomy.taxonomy
  • wp_term_taxonomy.term_id
person C-Pound Guru    schedule 08.12.2010