2017-12-02 9 views
-1

안녕하세요, 저는 아주 awfull 쿼리가 있습니다. 최적화가 필요합니다.mysql optimization query where 날짜 시간

작성된 날짜가 NOW - 35days와 일치하는 모든 레코드를 선택해야하지만 분과 초는 any 일 수 있습니다.

그래서 나는 여기의 추악한를이 쿼리를 가지고 있지만, 작업 :

모든 최적화 팁 환영합니다!

SELECT * FROM outbound_email 
       oe 
       INNER JOIN (SELECT `issue_id` FROM `issues` WHERE 1 ORDER BY year DESC, NUM DESC LIMIT 0,5) as issues 
       ON oe.issue_id = issues.issue_id 
       WHERE 
        year(created) = year( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        month(created) = month( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        day(created) = day( DATE_SUB(NOW(), INTERVAL 35 DAY)) AND 
        hour(created) = hour( DATE_SUB(NOW(), INTERVAL 35 DAY)) 
        AND campaign_id IN (SELECT id FROM campaigns WHERE initial = 1) 
+0

많은 사람들이 여기에서 쿼리를 최적화하는 데 도움을 요청했습니다. 당신은 upvoted되고 닫히는 것들과 함께 upvoted하고 대답 된 몇 가지 질문을보고 시작할 수 있습니다. 전자의 공통된 특징은 스키마 정의, 계획 설명, partialnand 전체 select 문에 대한 타이밍입니다. – symcbean

답변

0

내가 "창조"필드 가정 날짜 시간 필드이며, 문제의 테이블에서입니까? 당신이 문제와 캠페인 테이블에 무엇을 필요로하지 않기 때문에, 당신은 다음을 수행 할 수 있습니다 등의 년, 월 ...에 날짜 필드를 분리 할 필요가

SELECT e.* FROM outbound_email e 
JOIN issues i ON e.issue_id = i.issue_id 
JOIN campaigns c ON c.id = i.campaign_id 
WHERE i.created < DATE_SUB(NOW(), INTERVAL 35 DAY) 
AND c.initial = 1 

없습니다.

0

당신은 당신이

이 이
SELECT * FROM table WHERE created BETWEEN 
    DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 840) HOUR) AND 
    DATE_ADD(CURDATE(), INTERVAL (HOUR(now()) - 839) HOUR) 

가 왜 작동합니까 삼십오일 전에, 현재로서이 생성 된 시간이 같은 시간이었다 테이블에서 모든 행을 선택하려면 말하는 것 같다? 오늘 밤 커다이 트가 자정에 우리에게 준다. 우리는 시간의 현재 시간을 추가합니다 (예를 들어 오후 5시에 오후 5시에 17을주게 될 HOUR (NOW())를 추가한다고 가정하십시오.) 그러나 35 일이기 때문에 840을 뺍니다. 하루 24 시간 = 840 시간. 따라서 날짜 추가는 현재 날짜 즉, 오후 5시 35 분에 -823 시간을 더합니다.

시간에서 모든 레코드를 가져올 수있는 검색 범위를 만듭니다. 가장 나중에 시간을 지정하는 가장 간단한 방법은 839 시간을 빼는 것입니다. (포함 사이이 경우 대신 840

의 기술적이 쿼리는 오후 6시에 쾅 레코드를 반환합니다 (하지만 나중에하지 두 번째) 삼십오일 전에 너무 1과 10 사이에 10도

를 반환하기 때문에 문제가 있다면 둘 사이에 created >= blah AND created < blahblah을 변경하십시오.

나머지 검색어는 입력하지 않았습니다. 더 명확하게하기 위해

부작용으로, 당신이 한 방식은 나쁘지 않았습니다. 년/월/일 부품을 사용하지 않아서 단순화 할 수 있었고 날짜 부분을 date(created) = date_sub(curdate(), interval 35 day) 날짜와 시간 요소가 결합 된 년 월과 일입니다. 그러나 일반적으로 항상 테이블 데이터를 형식이 아닌 데이터로 두거나 쿼리와 일치하도록 변환하는 것이 가장 좋습니다. 테이블 데이터를 변환하면 인덱스를 더 이상 사용할 수 없습니다. 쿼리 매개 변수를 열 형식으로 가져오고 테이블 데이터를 변환하지 않으면 열의 인덱스를 사용할 수 있습니다.