2016-09-15 1 views
0
이 코드 사용하고

:MySQL의 쿼리 요청은 JDBC .executeQuery보다 훨씬 시간이 덜 걸립니다

double timeBefore = System.currentTimeMillis(); 
ResultSet rs = st.executeQuery(sql); 
double timeAfter = System.currentTimeMillis(); 
System.out.println(timeAfter - timeBefore); 

반환은 9904.0

입니다 동안 나는 워크 벤치 MySQL 클라이언트에서 동일한 쿼리를 수행 할 때 :

SELECT DISTINCT completeAddress FROM DB_M3_Medium.AvailableAddressesV2 where postNr = 2300 ORDER BY completeAddress ASC; 

이 소요 0.285s

그것은 어떻게 가능합니까?

추신 : 다양한 페이로드 크기로 시도해 보았습니다. 10 초는 자바 JDBC

편집과 :

나는 위와 같은 쿼리 PreparedStatement을 시도하고 약, 같은 시간이 걸렸습니다. 1s 적은.

은 또한 다음 코드로 ping을 시도했다 :

String query = "/* ping */ SELECT 1"; 
double timeBefore = System.currentTimeMillis(); 
PreparedStatement preparedStatement = DBConnect.getInstance().con.prepareStatement(query); 
ResultSet rs = preparedStatement.executeQuery(query); 
double timeAfter = System.currentTimeMillis(); 
System.out.println(timeAfter - timeBefore); 

을 그리고 응답했다 : 완벽하지만 좋은 것은 아닙니다 1306.0.

하지만 여전히 문제가있는 것은 아닙니다.

EDIT2 : 나는 걸리는 시간은 DB에있는 데이터의 양 (안 내가 검색하고있는 페이로드)와 관련이 있다고 생각했다. 색인 생성이 작동하지 않는 것처럼 보입니다. 하지만 왜 내가 JDBC를 가지고 갈 때만 문제가 생기 겠지만 WorkBench와는 관련이 없다.

+0

은 원격 서버의 db에 연결하는 Java 코드입니까? – e4c5

+0

예. 그렇지만 쿼리를 실행하는 동안 연결을 제외하고 10 초가 걸릴 수 있습니다. 페이로드 크기와 무관하다. –

+0

실제로 다른 답변은 여러 가지로 지적되었습니다. 오버 헤드가 있습니다. 둘 사이의 핑 (ping)을 위해 어떤 종류의 타이밍을 얻습니까? – e4c5

답변

2

자바에서 코딩하는 동안 연결을 생성하고 쿼리를 전달합니다. 그 쿼리는 SQL 서버에서 (Statement를 사용하면서) 컴파일되고 그 결과를 얻을 것이다. 이 전체 프로세스는 약간의 시간이 필요합니다. 그러나 작업 벤치에서 direclty를 실행하면 연결이나 컴파일 작업을 수행하지 않고 단순히 SQL을 실행하고 있습니다. 수행 시간이 짧습니다.

+1

심각하게? : D : 나는 당신이 Java가 WorkBench보다 느린 20-40 배의 쿼리를 실행하는 것이 표준 동작이라고 말해주고 싶습니까? –

+0

@OndrejTokar 나는 당신이 항상 20-40 배 느려질 것이라고 생각하지 않는다. 실행 시간을 확인하는 가장 적절한 방법은 System.nanotime – SpringLearner

0

한 가지주의 할 점은 JDBC 드라이버 순수 자바이기 때문에 MySQL 워크 벤치에는 적용되지 않는 조기 JIT 컴파일을 실행하고있을 것입니다. JDBC 드라이버 코드가 JIT를 통과 한 후에는 비슷한 성능을 보게 될 것입니다. 진짜 테스트는 그 코드를 몇 번 더 넣고 무슨 일이 일어나는지 보게 될 것입니다.

PreparedStatement을 사용할 수도 있습니다. 그 이유는 불필요한 쿼리 재 컴파일을 피하기 위해 MySQL 워크 벤치가 사용하는 API와 가장 유사한 API 여야하기 때문입니다.

+0

입니다. 나는'PreparedStatement'가 정말로 아무 것도 개선하지 않았다고 시도했습니다. –

0

마찬가지로 @SpringLearner은 쿼리를 실행할 때마다 JDBC에 제안되어 새로운 연결을 만들고 약간의 시간이 걸립니다. 이 오버 헤드와 성능을 피하기 위해 데이터 소스를 사용할 수 있습니다.

관련 문제