2011-11-10 7 views
1

테이블을 항상 위에서 아래로 읽는 응용 프로그램에서 MySQL 테이블을 한 줄씩 읽을 때 완벽하게 순차적으로 읽는 것이 안전할까요?MySQL 테이블 읽기 순서 안정성

E.G. 테이블이 고유 한 ID로 정렬되어 있고 한 번에 한 줄씩 C++을 통해 읽습니다. 매번 정확한 고유 ID 순서로 각 줄을 가져올 것이라고 가정하는 것이 안전합니까?

내 직감은 안전한 가정이 아니라는 기술적 인 추론이 없다는 것입니다.

내 테스트는 항상 테이블 행을 순서대로 제공한다는 것을 보여 주었지만 신경 쓰이게합니다. 결과적으로 나는이 프로그램들이 좀 더 복잡하고 조금 덜 효율적이라는 가정에 의존하지 않도록 프로그램을 작성한다. 당신은 표준 C++ MySQL의 커넥터를 사용하는 경우가 더 문제가 없어야합니다 다음 쿼리,

SELECT columns 
FROM tables 
WHERE predicates 
ORDER BY column ASC/DESC; 
+0

정확히 ORDER BY가 달성해야한다고 생각했습니다. oO – DanielB

+0

MySQL 데이터베이스에 연결할 때 어떤 라이브러리를 사용하고 있습니까? –

+0

표준 (제 생각에는) C++ 커넥터. – Columbo

답변

1

를 사용하는 경우

감사 C

2

다음 reference manual, "미리보기 버전에 따라 커서를 지원하기 위해 클라이언트의 모든 결과 세트를 버퍼링합니다. "

또한 일반적으로 결과 집합이 버퍼링되므로 내재 테이블이 변경 될 때 변경되지 않습니다.

0

당신 말이 맞습니다. 응용 프로그램에서 행마다 MySQL 테이블을 읽을 때 테이블이 항상 위에서 아래로 읽히는 것이 안전하지 않습니다. 순차적으로 순차적으로 읽습니다. 테이블이 고유 ID로 정렬되어 있고 한 번에 한 줄씩 (C++ 또는 다른 방법을 통해) 한 번에 읽을 경우 매번 정확한 ID 순서로 각 줄을 얻을 수 있다고 가정하는 것이 안전하지 않습니다.

모든 RDBMS에서 그 보증을 보장 할 수 없습니다. 아무도 그 가정에 의존해서는 안됩니다.

행에는 관계형 테이블의 내장 또는 기본 순서가 없습니다 (읽음 : 없어야 함). 테이블 (릴레이션)은 정의에 따라 정렬되지 않은 세트 또는 행입니다. 이 느낌을 준다 무엇

대부분의 시스템이 물었을 때 같은 쿼리에 대한 결과를 반환하는 것입니다 :

SELECT columns 
FROM table 

가 전체 파일을 읽는 디스크에서 모든 행을 검색 할 수 있습니다. 따라서 파일에 저장된 순서대로 또는 클러스터 된 키순 (예 : MySQL의 InnoDB 테이블)에 행을 반환합니다 (일반적으로). 따라서 매번 동일한 순서로 결과를 반환합니다.

이 나 WHERE 조건이 존재하는 경우는 전체 테이블이 읽기하지 완전히 다른 상황이,의, 다른 인덱스를 사용할 수있다 FROM 절에서 여러 테이블, 그래서 시스템이 테이블 파일을 읽을 수 없습니다 경우 만 그냥 색인 파일. 또는 테이블의 작은 부분을 읽으십시오.

테이블 또는 분산 데이터베이스를 분할 한 경우에도 다른 이야기입니다.

매번 같은 순서를 보장하려면 검색어에 ORDER BY 부분이 있어야합니다.