2011-02-10 4 views
0

У меня есть запрос в моей WordPress плагин, как это:SQL: Chaining Присоединяется Эффективность

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
     LEFT JOIN `nwp_usermeta` U 
      ON users.`ID`=U.`user_id` 
     LEFT JOIN `nwp_usermeta` M 
      ON users.`ID`=M.`user_id` 
     LEFT JOIN `nwp_usermeta` C 
      ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
     AND M.meta_key = 'last_name' 
     AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10 

Я новичок в использовании JOIN и мне интересно, насколько эффективно это использовать так много JOIN в одном запросе , Лучше ли разбить его на несколько запросов?

The database schema can be found here.

ответ

3

JOIN обычно не так уж плохо, если ключи индексируются. LEFT JOIN почти всегда поражает производительность, и вам следует избегать его, если это возможно. Разница в том, что LEFT JOIN присоединится ко всем строкам в объединенной таблице, даже если столбец, с которым вы соединяетесь, равен NULL. В то время как обычный (прямой) JOIN просто соединяет строки, которые соответствуют.

Опубликуйте свою структуру таблицы, и мы можем дать вам лучший запрос.

+0

В этом случае таблица будет я всегда присоединиться введите строку, соответствующую моим критериям. Но если регулярный JOIN будет быстрее, я буду использовать это. Если вас это интересует, это установка в стиле ванильного WordPress, так что схема таблицы приведена здесь: http://codex.wordpress.org/Database_Description#Table:_wp_users –

+0

JOIN, безусловно, будет быстрее, даже если есть совпадения для всего. Ваш запрос в порядке, просто измените LEFT JOIN на JOIN. Затем убедитесь, что поля user_id и вашего идентификатора в разных таблицах имеют индекс. Возьмите совет @ MatejB, чтобы использовать EXPLAIN для анализа запроса. – Cfreak

1

Попробуйте объяснить запрос, чтобы увидеть, что происходит, и если ваш выбор, если оптимизируется. Если вы не использовали объяснить, прежде чем читать некоторые учебники:

http://www.learn-mysql-tutorial.com/OptimizeQueries.cfm

http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm

2

Смотрите этот комментарий:

http://forums.mysql.com/read.php?24,205080,205274#msg-205274

Для чего это стоит, чтобы узнать, что делает MySQL и увидеть, если вы индексируются должным образом, всегда проверяйте EXPLAIN план. Вы делаете это, помещая EXPLAIN перед запросом (буквально добавляйте слово EXPLAIN перед запросом), а затем запустите его.

В вашем запросе у вас есть фильтр AND C.meta_key = 'nwp_capabilities', что означает, что все ЛЕВОЕ СОЕДИНЕНИЕ над ним могут быть одинаково записаны как INNER JOIN. Поскольку если LEFT JOINS fail (LEFT OUTER предназначен для сохранения результатов с левой стороны), результат будет отфильтрован на 100% по предложению WHERE.

Так более оптимальным запрос будет

SELECT users.*, U.`meta_value` AS first_name,M.`meta_value` AS last_name 
    FROM `nwp_users` AS users 
     JOIN `nwp_usermeta` U 
      ON users.`ID`=U.`user_id` 
     JOIN `nwp_usermeta` M 
      ON users.`ID`=M.`user_id` 
     JOIN `nwp_usermeta` C 
      ON users.`ID`=C.`user_id` 
    WHERE U.meta_key = 'first_name' 
     AND M.meta_key = 'last_name' 
     AND C.meta_key = 'nwp_capabilities' 
    ORDER BY users.`user_login` ASC 
    LIMIT 0,10 

(примечание: "JOIN" (один) = "INNER JOIN")

Смежные вопросы