2009-10-30 2 views
1

첫번째 옵션, 내 주요 질문 중 NFI 메신저 : 느린 데이터베이스 액세스에 대한 변수 문제로 실행하면 좋은 문제 해결 방법은 무엇MySQL은/​​php에 연결, 구성, 인덱스, 쿼리, 버퍼, 모든

.

배경 : 메인 테이블에서 버퍼링되지 않은 쿼리를 사용할 수 있도록 여러 개의 db 연결을 처리하는 시스템이 있습니다. select. 나는 매우 단순한 쿼리 (ID, 이름, 제목 등을 선택하는 작업에서 일시 중지가 발생하는 곳을 보았습니다.)는 시스템에서 아무 것도 찾지 못하거나 업데이트로 덮어 쓰지 않으면 삽입합니다 .

중간에 동일한 쿼리를 처리 할 때 일시 중지가없는 상태에서 이러한 쿼리에 대해 다중 초 일시 중지가 발생합니다.

인덱스가 손상되었거나 업데이트하는 데 너무 오래 걸릴 수 있습니다 (char (13)), 버퍼링되지 않았거나 버퍼링 됨으로써이 포인트 쿼리에 약간의 차이가 있습니다.

여러 개의 테이블 (실행 후 프로세스가 작성되고 처리 된 후에 버려지며 프로세스가 약간 다르지만 저장된 데이터는 동일합니다)가 연속적으로 다른 시간에 여러 테이블에서 발생합니다 실행 대기 시간 간격도 다릅니다.

또한

, 나는 MySQL의 PROCESSLIST에서 찾고이 쿼리 대기가 표시되지, 이것은이 거의 의미가있는 경우 나이 PHP를 CLI와 MySQL (같은 상자)

죄송 사이의 전송 문제를 생각하고있다 - 내 두뇌는 절대적으로 튀김과 지금 지쳐있다.

아무도 이런 식으로 만난 적이 있습니까? 그렇다면 근본 원인을 어떻게 추적 했습니까?

+0

동의 해 주셔서 감사합니다. Jim! 당신이 그걸 해결할 수 있기를 바랍니다. –

답변

2

나는 최근에 mytop이 잠깐 씩 설문 조사를하는 것으로 나타 났는데, 이는 오히려 드러날 수 있습니다.

나에게 이것은 MyISAM 엔진 테이블에서 테이블 잠금과 비슷하게 들린다. 당신은 당신의 테이블이 실행중인 엔진을 언급하지 않습니다. 또한 삽입/업데이트/선택 비율은 무엇입니까? 업데이트 속도가 높으면 MySQL 쿼리 캐시를 사용하는 것이 약간의 개선이 될 수 있습니다.

EXPLAIN이 더 비싼 쿼리에 대해 알려주는 것은 무엇입니까? 인덱스를 설계 한 방식을 조정하거나 쿼리의 where 절을 다시 정렬해야 할 수도 있습니다. EXPLAIN이 전체 테이블 스캔 또는 매우 높은 행 수를 제공하는 경우 가능하면 최선의 방법으로 인덱스를 사용하지 않을 것입니다.

고유하지 않은 색인 된 ID에 대해 자세히 설명해 주실 수 있습니까? SHOW CREATE TABLE이 도움이 될 수 있습니다.

편집

당신이 귀하의 경우 메모리를 할당하는 데 걸리는 시간이 중요 할 수 있음을 알려줍니다 당신의 버퍼 크기와 볼 향상을 감소했다면

. 쿼리 성능이 1 초 미만이면 시스템 성능, 특히 메모리를 검사하기 시작합니다. 상단부터 시작하여 메모리별로 정렬하고 스왑 공간과 페이지 오류 수를 표시하는 것이 좋습니다. 또는 vmstat을 실행하고 스왑 활동을 감시합니다. 대기 시간이 길어지면 디스크 처리량을 기다리는 중일 수 있습니다. (성능 변화가없는 innodb 로의 전환은 흥미 롭습니다. 램이 부족하다면 메모리가 부족하면 더 빠르게 노출 될 것이라고 생각합니다.)

웹 응용 프로그램입니까? 그렇다면 연결/스레드 수, httpd 연결 수 및 쿼리 대기 시간간에 상관 관계가 있습니까?나는 PHP baloon apache 프로세스가 35MB에서 512MB로 증가한 것을 보았고, 이후에이 머신은 스왑 랜드로 갈 것이다.

하드웨어 문제 일 가능성이 있습니다. dmesg를 검사하여 메모리 또는 디스크 문제에 대한 커널 보고서가 있는지 항상 확인하는 것이 좋습니다. 시스템에서 실행중인 다른 것이 있습니까? 디스크 나 메모리와 경쟁 할 수있는 크론 작업이 있습니까?

+0

MyISAM, 고유하지 않은 색인 된 ID는 EAN char 13 필드이며 모든 자릿수이지만 ISBN10의 호환성을 위해 텍스트를 처리해야합니다. 많은 업데이트/삽입이 가능합니다. 나는 innodb로 전환했고이 문제에 대한 개선을 보지 못했습니다. – Louis

+0

흥미로운 점은 분명히 테이블 잠금 문제가 아니기 때문에 모든 업데이트/삽입을 테이블로 제거 했으므로 하나의 기본 선택과 필요한 모든 도우미 만 처리하기 때문입니다. 여전히 많은 양의 대기가 발생합니다. 또한 버퍼링 크기를 100k에서 20k로 줄였으며 현재 2 초의 대기 시간 만 보입니다. mysql이 새로운 쿼리를 허용하기 전에 일부 데이터를 해제해야하고 mem을 처리해야합니까? – Louis

+0

편집; vmstat 등을 보는 것을 고려하십시오. –