簡體   English   中英

查詢速度極慢

[英]Extremely slow query

以下是一個查詢,需要30秒鍾以上的時間才能運行。 基於我正在運行的類似查詢,我看不到這里的保持位置。 我唯一的想法是將作業用戶ID與job_applicants用戶ID結合在一起,但是需要對其進行映射。

SELECT DISTINCT u.user_id, u.first_name, u.last_name FROM users u
LEFT OUTER JOIN employee_access ea ON ea.user_id = u.user_id
LEFT OUTER JOIN confirmation c ON c.user_id = u.user_id
LEFT OUTER JOIN job_applicants a ON a.user_id = u.user_id
LEFT OUTER JOIN job j ON j.job_id = a.job_id
WHERE ea.access_id = 4 OR c.access_id = 4 OR (a.process_level = 0 AND j.access_id = 4) 
ORDER BY u.last_name asc

exists用途:

select u.*
from users u
where exists (select 1
              from employee_access ea 
              where ea.user_id = u.user_id and ea.access_id = 4
             ) or
      exists (select 1
              from confirmation c 
              where c.user_id = u.user_id and c.access_id = 4
             ) or
      exists (select 1
              from job_applicants a join
                   job j 
                   on j.job_id = a.job_id
              where a.user_id = u.user_id and
                    a.process_level = 0 AND j.access_id = 4
             )
order by u.last_name;

這將防止所有笛卡爾積和最終重復項的刪除。

我會建議以下指標:

  • users(last_name, user_id)
  • employee_access(user_id, access_id)
  • confirmation(user_id, access_id)
  • job_applicants(user_id, process_level, job_id)
  • job(job_id, access_id)

還有另一種方法。 這樣做的好處是, 首先收集user_ids列表, 然后再進入users的其他列:

SELECT  u.user_id, u.first_name, u.last_name
    FROM  users u
    JOIN (
        ( SELECT user_id FROM employee_access WHERE access_id = 4 )
        UNION DISTINCT
        ( SELECT user_id FROM confirmation    WHERE access_id = 4 )
        UNION DISTINCT
        ( SELECT a.user_id 
              FROM job_applicants a 
              JOIN job j  USING(job_id)
              WHERE a.process_level = 0
                AND j.access_id = 4 )
    ) AS x USING(user_id)
    ORDER BY u.last_name ASC

索引:

employee_access: INDEX(access_id, user_id)  -- (covering)
confirmation:    INDEX(access_id, user_id)  -- (covering)
job:             INDEX(access_id, job_id)  -- (covering)
job_applicants:  INDEX(process_level, job_id, user_id)  -- (covering)
users:  PRIMARY KEY(user_id)

看看這是否會刮掉其余8秒鍾的大部分時間。

這應該工作。 它的概念與戈登的答案相似, 但是我對相關子查詢的病理性邊界不信任

SELECT DISTINCT u.user_id, u.first_name, u.last_name 
FROM users u
WHERE u.user_id IN (SELECT user_id FROM employee_access WHERE access_id = 4)
   OR u.user_id IN (SELECT user_id FROM confirmation WHERE access_id = 4)
   OR u.user_id IN (
        SELECT a.user_id 
        FROM job_applicants a 
        INNER JOIN job j ON j.job_id = a.job_id
        WHERE a.process_level = 0 AND j.access_id = 4
      )
ORDER BY u.last_name asc

暫無
暫無

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

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