SQL QUERY给了我想要的输出,但是花了很长时间来加载输出。我该如何优化呢?

时间:2016-12-15 13:40:49

标签: mysql sql optimization

我有三个表,用户(包括用户详细信息),territory_categories(具有不同的地域名称及其ID),user_territory(两者之间的联结表)

我想根据列表中的选定区域过滤用户。

查询 -

SELECT u.id,account_id_fk,first_name,last_name,email_address,password,mobile_number,gender,user_accuracy,check_in_radius,report_to,role,allow_timeout,
  active,last_logged_on,last_known_location_time,last_known_location,u.created_on,u.created_by,
(SELECT COUNT(DISTINCT u2.id) FROM fieldsense.users u2 
INNER JOIN  user_territory t1 ON u2.id=t1.user_id_fk 
INNER JOIN territory_categories c on c.id=t1.teritory_id 
**WHERE c.category_name LIKE** "Gujarat"  AND(u2.account_id_fk=1 AND u2.role!=0) ) AS usersCount, 
IFNULL(a.id,0) attendanceId,IFNULL(a.punch_date,'1111-11-11') punchInDate,IFNULL(a.punch_in,0) punchIntime,IFNULL(a.punch_out_date,'1111-11-11') punchOutDate, IFNULL(a.punch_out,0) punchOutTime 
FROM fieldsense.users as u 
LEFT OUTER JOIN attendances as a ON u.id=a.user_id_fk AND a.id=(select max(id) from  attendances att where att.user_id_fk=u.id) 
INNER JOIN  user_territory t1 ON u.id=t1.user_id_fk 
INNER JOIN territory_categories c on c.id=t1.teritory_id 
**WHERE c.category_name LIKE "Gujarat"**  
GROUP BY u.id  **limit 10**  

输出:

usersCount: 136
        attendanceId: 0
        punchInDate: 1111-11-11
        punchIntime: 0
        punchOutDate: 1111-11-11
        punchOutTime: 0
    10 rows in set (2.06 sec)

加载时没有where子句,显示数据需要将近1分钟

没有where子句的输出:

usersCount: 144
        attendanceId: 0
        punchInDate: 1111-11-11
        punchIntime: 0
        punchOutDate: 1111-11-11
        punchOutTime: 0
    10 rows in set (54.45 sec)

我正在获得所需的输出,但查询需要花费大约1分钟来加载,我想要优化。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

试一试。我只是缩小了表user_territory上的内部联接,因此它不会加入整个user_territory表,但只会加入不同的user_id。希望它能缩短性能时间,

SELECT u.id,
 account_id_fk,
 first_name,
 last_name,
 email_address,
 PASSWORD,
 mobile_number,
 gender,
 user_accuracy,
 check_in_radius,
 report_to,
 role,
 allow_timeout,
 active,
 last_logged_on,
 last_known_location_time,
 last_known_location,
 u.created_on,
 u.created_by,
 (
    SELECT
        COUNT(u2.id)
    FROM
        fieldsense.users u2
    INNER JOIN (SELECT DISTINCT user_id_fk as id, territory_id FROM user_territory ) t1 ON u2.id = t1.id
    INNER JOIN territory_categories c ON c.id = t1.teritory_id 
    WHERE
        c.category_name LIKE "Gujarat"
    AND (
        u2.account_id_fk = 1
        AND u2.role != 0
    )
) AS usersCount,
 IFNULL(a.id, 0) attendanceId,
 IFNULL(a.punch_date, '1111-11-11') punchInDate,
 IFNULL(a.punch_in, 0) punchIntime,
 IFNULL(
    a.punch_out_date,
    '1111-11-11'
) punchOutDate,
 IFNULL(a.punch_out, 0) punchOutTime
FROM
    fieldsense.users AS u
LEFT OUTER JOIN attendances AS a ON u.id = a.user_id_fk
AND a.id = (
    SELECT
        max(id)
    FROM
        attendances att
    WHERE
        att.user_id_fk = u.id
)
INNER JOIN (SELECT DISTINCT user_id_fk as id, territory_id FROM user_territory ) t1 ON u2.id = t1.id
INNER JOIN territory_categories c ON c.id = t1.teritory_id 
WHERE
    c.category_name LIKE "Gujarat" 
GROUP BY
    u.id 
LIMIT 10