2015-01-12 3 views
2

안녕하세요. 나는 천천히 실행 쿼리를 속도를 시도하는 임무가 주어진다지만, MYSQL의 초보자되는 최상의 결과를 얻을 수 있는지 모르겠습니다. 나는 포럼이 이미 이런 유형의 질문에 흩어져 있다는 것을 알고 있으며, 많은 내용을 읽었지만 가능하다면 더 많은 도움을 주시면 감사하겠습니다.MySQL의 쿼리 속도 향상

조인을 제거하고 기본 선택 속도를 높이려고 시도하여 최적화 절차를 시작했습니다. 테이블에는 약 4 400 000 개의 항목이 있고 쿼리는 1 800 000 개의 항목 영역에서 반환됩니다.

나는이 시작 :

select 
    ID, 
    CallStarted, 
    CallDirection 
from 
    TRMSMain.tblcalldata CALLDATA 
    where CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59' 
ORDER BY ID DESC LIMIT 0 , 50; 

그것은 360 초 걸렸습니다. 마지막 쿼리가 범위의 첫 번째 50을 반환하지만 그것은 "순서 내림차순으로"작업이 매우 비싼 믿고 나를 인도, 대신 마지막 (50),

select 
    ID, 
    CallStarted, 
    CallDirection 
from 
    TRMSMain.tblcalldata CALLDATA 
where CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59' 
LIMIT 0 , 50; 

: 그러나 이것은 2 초 걸렸습니다. 는 그때 약간의 주위에 바이올린과 함께 제공된 (때로는) 40초 20 간 걸립니다, (물론 어느 그것을 짓을 할 수있는 유일한 방법은 아니다) 다음

use trmsmain; 
RESET QUERY CACHE; 
drop procedure if exists intTest; 
delimiter # 
create procedure intTest() 
BEGIN 
    declare lastID int unsigned default 0; 
    declare frstID int unsigned default 0; 
    select 
     (select max(ID) from trmsmain.tblcalldata where (CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59')) 
     into lastID; 
    set  frstID = lastID - 49; 
    CREATE TEMPORARY TABLE IF NOT EXISTS table2 (index (ID)) AS 
    (  
     select 
      ID, 
      CallStarted, 
      CallDirection 
     from 
      trmsmain.tblcalldata CALLDATA 
     where 
      ID between frstID AND lastID 
    ); 
    select * from table2 order by ID desc; 
END # 
delimiter ; 
call intTest(); 

결과는 정확히 무엇이 필요한지, callstarted는 인덱싱 된 필드이지만, 이런 종류의 성능이 수용 가능한지 (내 기대할 수있는 최상의) 것인지를 묻는 질문에 대한 답입니다. 내 PC는 4GB RAM의 중간 범위입니다.

알려 주시기 바랍니다. 감사합니다.

MORE INFO :

내 SQL 스크립트이 동일합니다 : 난 단지 그것을 내가 위의 MAX의 결과를 다시 사용하는 것이 있는지 확인하고 싶었 기 때문에 내가했던 방법을했다

select 
    ID, 
    CallStarted, 
    CallDirection 
    from trmsmain.tblcalldata CALLDATA 

where ID between (select(select max(ID) from trmsmain.tblcalldata where (CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59')) - 49) AND 
(select max(ID) from trmsmain.tblcalldata where (CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59')); 

, 그래서 위의 결과를 스크립트의 결과와 비교했습니다 (비슷한 내용).

나는 그가 설명 할 것을 보았을 때, 나는 혼란 스러웠고 callstarted에있는 것을 제외하고 모든 색인을 제거했다. ID가 기본 키입니다.

하나의 색인 만 있으면 시간이 1 초가됩니다. "(callstarted) 힘 인덱스를 사용하는 경우에도 나는이 결과에 가까운 올 수 없었다.

을 나는 더욱 지금 어떻게 든 혼란 스러워요.

감사

+2

성능에 도움이 필요하면 일반적으로 적절한 DDL과 EXPLAIN의 결과를 제공해야합니다. – Strawberry

+0

기본 키가 있습니까? 인덱스 및 테이블 스키마는 어떻습니까? –

+0

1 800 000 개의 항목은 반환해야 할 큰 숫자이며 테이블의 거의 절반을 나타냅니다. 필요한 항목 수를 줄일 수있는 방법이 있습니까? –

답변

0

당신이 id의 순차적 할당 알고 있다면, 당신은 이 시도 할 수 :

select ID, CallStarted, CallDirection 
from TRMSMain.tblcalldata CALLDATA cd JOIN 
    (select MIN(id) as minid, MAX(id) as maxid 
     from TRMSMain.tblcalldata CALLDATA cd2 
     where CallStarted BETWEEN '2014-02-10' AND '2014-05-11 23:59:59' 
    ) s 
    on cd.id >= minid and cd.id <= maxid 
order by id desc 
limit 0, 50; 

MySQL이 샘에서 모두 onorder by에 대한 인덱스가 사용 똑똑 경우이, 당신의 버전보다 더 빠르게 될 수있는 성능을 전자 시간.

TRMSMain.tblcalldata(CallsStarted)에 색인을 만들어보십시오.

+0

올바른 결과가 나오지만 약 100 초가 걸립니다. 시도하고 도움을 주셔서 감사합니다. – Anton

0

날짜/시간별로 가장 최근의 날짜와 시간을 찾고있는 경우 전화가 끊어지면 통화가 삽입되므로 통화 종료 시간을 기준으로 순차적으로 표시됩니다. 데이터 샘플 :

ID CallStarted   CallEnded 
1 2015-01-12 8:37  2015-01-12 8:44 
2 2015-01-12 8:42  2015-01-12 8:52 
3 2015-01-12 8:29  2015-01-12 9:09 
4 2015-01-12 8:56  2015-01-12 9:11 
5 2015-01-12 8:30  2015-01-12 9:12 
6 2015-01-12 9:09  2015-01-12 9:32 

이 경우, 전화가 시작될 때 ENDEDED를 기준으로 쿼리를 수행하는 것이 더 합리적입니까? 문제가 발생하는 유일한 시간은 명시 적으로 자정과 다음 날로 이동하는 전화 통화입니다.

아직 관심이있는 요소가있는 COVERING INDEX가 있으므로 원시 데이터 페이지로 돌아갈 필요는 없지만 인덱스에서 직접 가져올 수 있습니다.이 경우에는 호출을 끝내십시오 END 주요 위치에있는 인덱스로 날짜 :

이 그런 시도

빌드에 대한 인덱스 (CallEnded, CallStarted, ID, CallDirection)

select 
     C.ID, 
     C.CallStarted, 
     C.CallDirection 
    from 
     TRMSMain.tblcalldata C 
    where 
     C.CallEnded BETWEEN '2014-02-10' AND '2014-05-11 23:59:59' 
    order by 
     C.CallEnded DESC 
    LIMIT 
     0, 50 

겠습니까 당신을 위해이 일 ...

+0

불행히도 통화는 통화가 완료된 후에 만 ​​추가되므로 지금은 잘못되어있을 수 있습니다. 어쨌든 내 질문을보고 주셔서 감사합니다. – Anton

+0

@Anton, 개정 가능성? – DRapp

+0

@Anton, 개정 가능성 - 전화 종료시? – DRapp

0

시간을내어 내 질문을 보았던 모든 분들께 감사드립니다. 저는 항상 컴퓨터 커뮤니티에서 지원과 도움을 얻는 것에 놀랐습니다. 내 문제는 올바른 색인이 사용되지 않고 "ORDER BY DESC"를 대체하는 해결 방법이 시간을 많이 벗어난 것입니다. 나는 코드를 개선하기 위해 여기에서 발견 한 것을 사용하려고 노력할 것이다. 잘 지켜라.