Оптимизация сложного запроса MySQL - PullRequest
1 голос
/ 20 мая 2011

Следующий запрос занимает 0,1313 секунды на phpmyadmin.Любой способ оптимизировать это, чтобы сделать вещи быстрее (скажем, как получить его за 0,00XX секунд)?Индекс уже добавлен в столбцы, в которых выполняются объединения.

SELECT m.id, m.civ, m.prenom, m.nom, m.sexe, m.depart, m.date_entree, m.date_sortie, m.login_userid, m.login_passwd, a.rank_id, r.rank_m, r.rank_f, d.user_id AS depID, c.nom AS cordo, z.rank
FROM `0_member` AS m
LEFT JOIN `0_area` AS a ON ( m.id = a.user_id
AND a.sec_id =2 )
LEFT JOIN `0_rank` AS r ON r.id = a.rank_id
LEFT JOIN `0_depart` AS d ON ( m.depart = d.depart
AND d.user_sec =2 )
LEFT JOIN `0_area` AS z ON ( d.user_id = z.user_id
AND z.sec_id =2 )
LEFT JOIN `0_member` AS c ON d.user_id = c.id
WHERE z.rank = 'mod'
ORDER BY nom

Ответы [ 2 ]

1 голос
/ 20 мая 2011

В вашем запросе есть последнее предложение "WHERE", в котором значение FOUND указано в таблице псевдонимов "Z" с рангом "mod", однако ваш запрос представляет собой все соединения влево, указывая на то, что вы хотите, чтобы все члены независимо от возможного совпадения были включены.правая боковая таблица, к которой вы присоединяетесь.

Кроме того, вы присоединяетесь к таблице "z" вниз по течению, отправляясь и уходя к идентификатору пользователя, затем снова присоединяясь непосредственно к '0_area' как таблица A напрямуюдля идентификатора пользователя, который появляется, он будет таким же, как было найдено из ссылки на таблицу выписок на таблицу 'z' в любом случае.

Тем не менее, и ваш участник присоединяется к вылету, а затем к области ...

Мое ПРЕДЛОЖЕНИЕ (и я могу переписать запрос как таковой) состоит в том, чтобы поменять порядок запроса, поместив вашу таблицу Area FIRST с указанием индекса «sec_id, rank» ...порядок ключей, основанный на какой-либо категории, в которой столбец меньшего подмножества был первым ... поэтому либо SEC_ID, RANK, либо RANK, SEC_ID.Затем выполните простое JOIN (не LEFT JOIN) для других таблиц ... Как минимум от:

SELECT STRAIGHT_JOIN
      m.id, 
      m.civ, 
      m.prenom, 
      m.nom, 
      m.sexe, 
      m.depart,  
      m.date_entree, 
      m.date_sortie, 
      m.login_userid, 
      m.login_passwd, 
      a.rank_id, 
      r.rank_m, 
      r.rank_f, 
      d.user_id AS depID, 
      c.nom AS cordo, 
      z.rank
   FROM 
      `0_area` AS z
          JOIN `0_depart` AS d
             on z.user_id = d.user_id
             and d.user_sec = 2
             JOIN `0_member` AS m
                on d.depart = m.depart
                AND z.user_id = m.id
          LEFT JOIN `0_rank` AS r
             on z.rank_id = .rid
   WHERE
          z.sec_id = 2
      AND z.rank = 'mod'
   ORDER BY
      nom

В исходном запросе вы имели соединение с

member
   Links to Area (on member's user ID just to ensure the "sec_id = 2")

, так какновый запрос НАЧИНАЕТСЯ исключительно с таблицы "area" в качестве псевдонима "Z", а в условии TH, где предложение явно имеет значение "sec_id = 2", вам больше никогда не потребуется обратная ссылка ...

Area (only SECID = 2 and rank = mod)
  Links to Depart (on the User's ID)
      Links to Members by (on the depart ID)
0 голосов
/ 20 мая 2011

Попробуйте переместить эти операторы "a.sec_id = 2", "d.user_sec = 2", "z.sec_id = 2" из разделов ON в раздел WHERE, как вы уже сделали с "z.rank = 'mod'" , Как это:

SELECT m.id, m.civ, m.prenom, m.nom, m.sexe, m.depart, m.date_entree, m.date_sortie, m.login_userid, m.login_passwd, a.rank_id, r.rank_m, r.rank_f, d.user_id AS depID, c.nom AS cordo, z.rank
FROM `0_member` AS m
LEFT JOIN `0_area` AS a ON m.id = a.user_id
LEFT JOIN `0_rank` AS r ON r.id = a.rank_id
LEFT JOIN `0_depart` AS d ON m.depart = d.depart
LEFT JOIN `0_area` AS z ON d.user_id = z.user_id
LEFT JOIN `0_member` AS c ON d.user_id = c.id
WHERE z.rank = 'mod'
AND a.sec_id =2
AND d.user_sec =2
AND z.sec_id =2
ORDER BY nom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...