簡體   English   中英

優化復雜的mysql查詢

[英]Optimizing a complex mysql query

以下查詢在phpmyadmin上花費0.1313秒。 有什么方法可以優化它,從而使事情更快(比如說在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

您的查詢在別名為“ Z”的“ Z”別名表中的FOUND值上具有最終的“ WHERE”子句,但查詢為所有LEFT JOIN,表示您希望所有成員,無論右側是否可能匹配您要加入的表。

此外,您通過離開並離開用戶ID來下游連接到“ z”表,然后直接作為用戶ID上的A表直接重新連接到“ 0_area”,這看起來與從用戶ID中找到的相同無論如何,將離開表鏈接到“ 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”別名開頭,並且THAT where子句顯式為“ 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)

像使用“ z.rank ='mod'”一樣,嘗試將此語句“ a.sec_id = 2”,“ d.user_sec = 2”,“ z.sec_id = 2”從ON部分移動到WHERE部分。 像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM