2009-03-25 3 views
3

다음과 같은 시나리오가 있습니다 :MySQL - Concurrent SELECTS - 하나의 클라이언트가 다른 클라이언트를 기다리고 있습니까?

약 4 백만 행의 MyISAM 테이블이있는 데이터베이스가 있습니다. 필자는 저장 프로 시저 (MySQL 버전 5.1)와 특히 다양한 조건에서이 행을 검색하는 데 사용합니다. 이 테이블에는 여러 개의 인덱스가 있으며이 저장 프로 시저를 통한 쿼리는 일반적으로 매우 빠릅니다 (< 1s). 기본적으로 나는 준비된 문을 사용하고이 검색 sp에서 일부 동적 SQL을 작성하고 실행합니다. 준비된 문장을 실행 한 후, "DEALLOCATE PREPARED stmt;"를 수행합니다.

대부분의 쿼리는 초 단위로 실행됩니다 (LIMIT을 사용하여 언제든지 15 개의 행을 얻을 수 있습니다). 그러나 실행하는 데 더 오래 걸리는 드문 쿼리가 있습니다 (2-3 초). 가능한 한 검색된 테이블을 최적화했습니다.

웹 응용 프로그램을 개발했으며 빠른 개발 결과를 내 개발 컴퓨터에서 1 초 이내에 볼 수 있습니다.

그러나 두 개의 브라우저 인스턴스를 열고 실행중인 쿼리가 더 긴 쿼리와 빠른 쿼리를 사용하는 동시 검색을 동시에 수행하면 결과가 동시에 반환됩니다. 즉, 빠른 쿼리가 느린 쿼리가 결과를 반환하기 전에 완료 될 때까지 기다리는 것처럼 보입니다. 즉, 두 검색어 모두 2-3 초가 걸릴 것입니다.

이유가 무엇입니까? MyISAM이 SELECTS를 서로 관계없이 처리한다고 생각했기 때문에 현재 내가 겪고있는 행동이 아닙니다 ...

미리 감사드립니다! 팀

답변

0

이것은 동일한 기계에서 수행 한 것입니다. 검색이 동시에 두 가지 다른 시스템에서 이루어지기 때문입니다. 브라우저 창을 열어 새로 고침 만하면 MySQL 서버를 망칠 수있는 사람이 정말 좋겠습니까?

+0

이유가 될 수 있습니다! 아직 다른 컴퓨터에서 해본 적이 없지만 당신이 맞다고 생각합니다! 감사! – TMM

0

그래. 맞아. MyISAM 테이블의 각 select 쿼리는 완료 될 때까지 전체 테이블을 잠급니다. 그들의 변명은 "매우 높은 읽기 처리량"을 달성한다는 것입니다. InnoDB로 전환하면 동시 읽기가 허용됩니다.

+2

그 주장에 대한 참고 자료를보고 싶습니다. [MySQL 매뉴얼] (http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html) 동시 실행에서 선택할 수있는 것은 ** 서로를 차단하지 않는다는 것입니다. 읽기 잠금). – andri

관련 문제