關聯多張表查詢太慢,陳述句方面求大神看一下還能怎么優化一下,代碼如下:
SELECT
U.USER_ID,
U.USER_TYPE,
GROUP_CONCAT(DISTINCT R.ROLE_NAME) AS ROLE_NAME,
GROUP_CONCAT(DISTINCT DG.DATA_GROUP_NAME) AS DATA_GROUP_NAME,
GROUP_CONCAT(DISTINCT RG.RES_GROUP_NAME) AS RES_GROUP_NAME,
GROUP_CONCAT(DISTINCT SD.DEPT_NAME) AS DEPT_NAME,
U.USERNAME,
U.USER_LOGIN_NAME,
U.EMAIL
FROM
SYS_USER U
LEFT JOIN SYS_USER_ROLE UR ON UR.USER_ID = U.USER_ID
LEFT JOIN SYS_ROLE R ON R.ROLE_ID = UR.ROLE_ID
LEFT JOIN SYS_USER_DATA_GROUP UDG ON UDG.USER_ID=U.USER_ID
LEFT JOIN SYS_DATA_GROUP DG ON DG.DATA_GROUP_ID=UDG.DATA_GROUP_ID
LEFT JOIN SYS_USER_RES_GROUP URG ON URG.USER_ID=U.USER_ID
LEFT JOIN SYS_RESOURCE_GROUP RG ON RG.RES_GROUP_ID=URG.RES_GROUP_ID
LEFT JOIN SYS_USER_DEPT UD ON UD.USER_ID=U.USER_ID
LEFT JOIN SYS_DEPT SD ON SD.DEPT_ID = UD.DEPT_ID
<where>
<if test="sysUser.username != null and sysUser.username != ''">
AND USERNAME like concat('%', #{sysUser.username}, '%')
</if>
<if test="sysUser.userLoginName != null and sysUser.userLoginName != ''">
AND USER_LOGIN_NAME like concat('%', #{sysUser.userLoginName}, '%')
</if>
</where>
GROUP BY
U.USER_ID
uj5u.com熱心網友回復:
單純是這么看這段代碼,其實優化的空間不是特別大,而且好多欄位,沒有對應的表別名,更是增大了優化的難度。看這個,應該是統計用戶資訊的,建議直接新增冗余表,把這些你需要的內容,都放進去,然后在某處,單獨維護這個表。
uj5u.com熱心網友回復:
感謝大佬的回復,這個是查詢用戶表資訊同時查詢用戶的所屬角色名(角色表SYS_ROLE) 所屬機構(SYS_DEPT),等一共4個表,每個表和用戶表中間有個中間表(SYS_USER_ROLE, SYS_USER_DEPT ),目前我只能在陳述句上優化,資料庫我目前還不能操作有風險,所以請教一下,陳述句上還有哪些方面能優化一下呢
uj5u.com熱心網友回復:
沒有好大優化空間, 你like 又有左 %號 連索引seek 都不用使用。 但 如果你的 SYS_USER表欄位較多 你可以建一個 聯合索引(USER_ID,USER_TYPE,USERNAME,USER_LOGIN_NAME,EMAIL)建了這個聯合索引 有兩個好處
1、你這個查詢 sys_user 表 可以走索引 scan 且能索引覆寫 不需要回表
2、group by 的是 USER_ID 有了這個索引,那么就不需額外排序操作。
另外 你所有的left join 表 關聯欄位 必須 必須建索引。
uj5u.com熱心網友回復:
感謝大佬的回復,給我提供了很大的幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/234470.html
標籤:MySQL
上一篇:mysql存盤程序
下一篇:SQL按欄位名查詢值
