Оптимизация запроса MySQL SELECT? - PullRequest
1 голос
/ 17 июня 2011

Насколько можно изменить следующий запрос, чтобы повысить его производительность в «большой» базе данных?

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts 
WHERE 1=1 
  AND ((guid = '956e208f101562f6654e88e9711276e4') 
   OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
   OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
   OR (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 
 AND wp_rb_posts.post_type 
   IN ('post', 'page', 'attachment', 'revision', 'nav_menu_item') 
 AND (wp_rb_posts.post_status = 'publish' 
        OR wp_rb_posts.post_status = 'future' 
        OR wp_rb_posts.post_status = 'draft' 
        OR wp_rb_posts.post_status = 'pending' 
        OR wp_rb_posts.post_status = 'trash' 
        OR wp_rb_posts.post_status = 'auto-draft' 
        OR wp_rb_posts.post_status = 'inherit' 
        OR wp_rb_posts.post_status = 'private') 
ORDER BY wp_rb_posts.post_date DESC LIMIT 1400, 10;

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

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

Чтобы ответить на ваш вопрос напрямую, хотя здесь действует известный ответ «Это зависит».Мне нужно было бы просмотреть вашу БД, выполнить запрос, посмотреть план выполнения, посмотреть, что проиндексировано, и увидеть, как порядок предложений, сгенерированных планом выполнения, влияет на производительность и т. Д.

Надеюсь, что это поможет вам.

0 голосов
/ 17 июня 2011

Не зная ничего о соответствующей таблице, я делаю предположение на основе имен полей в запросе. Я предполагаю, что самая ограничительная часть запроса - это часть guid=.... Из структуры запроса также следует, что содержимое этого поля не полностью определено (иногда оно может иметь значение хеша md5, а иногда нет). Если это правильно, то кажется вероятным, что использование md5(guid) = '...' будет означать, что оно не может эффективно ограничивать эту часть запроса.

Так что, если возможно, кажется, что это сделало бы поиск более эффективным, если бы у вас было поле, которое всегда содержало хеш-значение md5 поля guid. Тогда это поле может быть проиндексировано и обеспечить гораздо более эффективный поиск для этой части запроса.

Чтобы попытаться уточнить, рассмотрим только этот запрос:

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts WHERE
   (guid = '956e208f101562f6654e88e9711276e4') OR
   (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 

Предполагая, что MySQL не разрешает индексы с использованием скалярных функций (что я не думаю, что это происходит, и если я ошибаюсь, тогда весь этот ответ бессмыслен), тогда этот запрос потребует полного сканирования таблицы, вычисляя md5(guid) на каждая запись. Принимая во внимание, что следующий запрос может быть оптимизирован намного лучше (при условии, что индекс существует в обоих полях:

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts WHERE
   (guid = '956e208f101562f6654e88e9711276e4') OR
   (md5_guid = '956e208f101562f6654e88e9711276e4') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...