2014-09-05 2 views
4

MySQL의 테이블은 MyISAM입니다.MyISAM 테이블 (MySQL) 및 PHP 잠금

이제 많은 데이터를 선택하고 싶습니다.

$res = $db->query("SELECT ..."); 
// -- Break 1 
while($row = $res->fetch_assoc()) { 
//working with the row; 
} 
// -- Break 2 

언제 테이블의 잠금이 종료됩니까? 휴식 1 또는 휴식 2?

+2

이것은 테이블 잠금에 대한 깊이 있고 유용한 정보입니다. http://dev.mysql.com/doc/refman/5.1/en/internal-locking.html –

+0

SQL을 프로파일 링하는 것이 mysql freeing table. [Details] (http://dev.mysql.com/doc/refman/5.5/en/show-profile.html) –

+0

잠금이 없습니다. – sectus

답변

0

@bauer까지 귀하의 질문을 이해했습니다. 나에게 가까운 대답은 while 루프로 작업하고 반복 할 리소스 객체 나 변수가있을 때입니다. 반복 작업이 완료되면 객체 또는 해당 변수가 자유롭기 때문에 페이지에서 한 번만 수행됩니다. null을 포함하므로 while 루프 번들을 실행하려면 결과 집합과 관계없이 각각 다른 obj를 정의해야합니다.

0

// - 중단 1

이 줄 앞의 프로세스 중에 데이터가로드됩니다. 표가 공개됩니다.

이 시점부터 추가 데이터 조작은 PHP 응용 프로그램에 있으며 더 이상 DB의 데이터가 필요하지 않습니다.

데이터 잠금이 없다는 이전 코멘트는 사용자의 관점에 달려 있습니다. 쿼리가 두 개의 레코드를 빨리 반환하면 잠금이 없음 (기술적으로 잘못되었지만 쉽게 오해 된 것)이 나타납니다. 그러나 쿼리가 복잡하고 결과가 거대하며 결과를 반환하기 위해 심각한 시간이 필요한 경우 (예를 들어 45 초 정도) MyISAM에 실제로 테이블 잠금이 있음이 명백하게 드러날 것입니다. 45 초 동안의 간단한 "쇼 프로세스리스트"는 잠긴 테이블을 분명히 보여줍니다. (테이블 레벨 잠금 대기는 일종의 죽은 공짜입니다.) 대형 비 시알 설치시 매일 발생합니다.

테이블을 인덱싱하면 잠금 시간이 줄어들 수 있습니다. "제한 50"(결과 데이터 세트를 제한하는 일부 숫자)을 설정하면 쿼리에 대해 실행 가능한 옵션 인 경우 잠금 시간을 줄일 수 있습니다.

또한 "재생을 시도하는"쿼리에 따라 잠금에는 몇 가지 방법이 있습니다. vs inserts vs updates를 선택할 수 있습니다 (잠금 메커니즘 연구가 도움이 될 수 있습니다). 테스트는 이해하는 것이 좋습니다. 3 천만 개의 레코드가있는 테이블을 생성하고 거대한 쿼리를 실행하여 두 가지 중 하나가 거대하고 다른 하나는 작고 "재생"하려고 시도하는 동안 선택/삽입/업데이트 사이에 어떤 잠금이 없는지를 두려워하지 마십시오. 하나는 달리고있다. 결과가 "이해"한다고 생각하더라도 놀랄 수 있습니다. 그런 다음 쿼리가 덜 중요하고 후속 쿼리가 해당 유형을 회전 할 때 어떤 일이 발생하는지 명시 적으로 기술 할 수 있는지 살펴보십시오.