안녕하세요. 나는 천천히 실행 쿼리를 속도를 시도하는 임무가 주어진다지만, 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) 힘 인덱스를 사용하는 경우에도 나는이 결과에 가까운 올 수 없었다.
을 나는 더욱 지금 어떻게 든 혼란 스러워요.
감사
성능에 도움이 필요하면 일반적으로 적절한 DDL과 EXPLAIN의 결과를 제공해야합니다. – Strawberry
기본 키가 있습니까? 인덱스 및 테이블 스키마는 어떻습니까? –
1 800 000 개의 항목은 반환해야 할 큰 숫자이며 테이블의 거의 절반을 나타냅니다. 필요한 항목 수를 줄일 수있는 방법이 있습니까? –