2010-06-05 6 views
2

MySQL을 사용하여 PHP 응용 프로그램의 세션 데이터를 관리하고 있습니다. 앱을 테스트 할 때 일반적으로 매우 빠르고 반응적입니다. 그러나 무작위 적으로 반응은 몇 초 후에 마침내 끝나기 전에 멈추게됩니다. 내가 이렇게 보이는 세션 쓰기 쿼리에 이르기까지 문제를 좁혀 :MySQL Insert Query가 무작위로 오랜 시간이 걸림

INSERT INTO Session VALUES('lvg0p9peb1vd55tue9nvh460a7', '1275704013', '') ON DUPLICATE KEY UPDATE sessAccess='1275704013',sessData=''; 

느린 쿼리 로그는이 정보를 가지고 :

Query_time: 0.524446 Lock_time: 0.000046 Rows_sent: 0 Rows_examined: 0 

이 매 10 시간에서 1을 발생합니다. 쿼리는 보통 ~ 0.0044 초 밖에 걸리지 않습니다.

표는 약 60 행의 InnoDB입니다. sessId는 BTREE 인덱스가있는 기본 키입니다.

모든 페이지보기에서 액세스되므로 분명히 허용되는 실행 시간은 아닙니다. 왜 이런 일이 일어나는 걸까요?

업데이트 : 테이블 스키마는 다음과 같습니다 sessId : VARCHAR (32), sessAccess : INT (10), sessData : 텍스트 BTREE 인덱스의 중간에 삽입하면 페이지의 석방을 요구 않습니다

+0

입니다? 귀하의 테이블에 대한 전체 스키마를 제공해주십시오. –

+0

테스트 환경 (프로세서, RAM, 디스크, 디스크의 여유 공간, CPU/RAM/디스크를 놓고 경쟁 할 수있는 상자에서 실행중인 것)을 설명하십시오. 때로는 임의의 성능 문제가 환경 문제입니다. –

+0

응용 프로그램은 약 300MB RAM의 VPS 호스팅 계획에 있습니다. 일반적으로 최소한의 웹 소프트웨어를 실행하는 CentOS 서버입니다. – CrossProduct

답변

2

주 꽤 자주, 그리고 색인의 일부분을 재구성하는 것입니다. 클러스터 된 인덱스 (기본 키는 클러스터 된 인덱스 일 가능성이 높음)의 경우 페이지를 다시 작성할 때 실제 행 데이터도 이동해야합니다.

행 데이터가 큰 경우 시간이 오래 걸립니다.

경우에 따라 자동 증가 기본 키를 사용하고 sessId에 고유 색인을 사용하면 클러스터 된 색인의 중간에 레코드를 삽입하지 않는 것이 가장 좋습니다.

0

제안 된대로 대리 자동 증가 키를 사용해 보았지만 쿼리를 실행할 때 속도 문제는 여전히있었습니다.

해결책은 테이블의 엔진을 MyISAM으로 전환하여 빠른 삽입을 수행하는 것이 었습니다.

+0

MYISAM 테이블이 INNODB 테이블보다 빨리 삽입되는 이유는 무엇입니까? MyISAM 엔진은 쓰기가 아닌 읽기에 가장 적합합니다. –

2

VM이 아닌 것에 문제를 재현하면 불평 할 수 있습니다.

가상 머신, 특히 임의의 제 3 자와 공유되는 머신은 내 경험에 의존 할 수없는 동작을합니다.

아마도 innoDB는 fdatasync()를 수행하려고 시도하고 있습니다. 이것은 실제적인 IO를 수행해야하는데, 이는 호스트 BO (다른 VM)에서 다른 작업에 의해 차단됩니다. 당신이 그들을 통제하지 않으면, 당신은 그 행동이 어떻게 될지 예측할 수 없습니다.

세션 테이블을 데이터베이스 종료시에도 지속시킬 필요가없는 경우 ENGINE = Memory를 고려하십시오. 더 강력한 데이터 내구성 요구 사항이 없을 경우

은 다음 InnoDB의 내구성 설정을 감소 (그러나 이것은 전체 서버뿐만 아니라 테이블에 영향을줍니다) sessData 열 어떤 종류의

+0

가능한 VM 경합에 대한 귀하의 요지를 봅니다. 리소스가 보장되는 경우에도 시스템 당 하나의 하드 드라이브 헤드 만 있습니다. MEMORY 엔진 사용을 고려했지만 MySQL 설명서에 따르면; "MEMORY 테이블은 고정 길이 행 저장 형식을 사용합니다." 따라서 아마도 크기가 다른 바이너리 데이터를 저장하는 가장 좋은 방법은 아닙니다. 특히 대부분의 항목이 비어있는 경우에 유용합니다. – CrossProduct

+0

VM이 아닌 환경에서 문제를 재현하려고 시도 했습니까? 가능한 경우 더 많은 조사가 필요합니다. 일반적으로 성능, 대기 시간 등은 실제 하드웨어만큼 VM에서 좋지 않으며 예측 가능성이 적습니다. – MarkR

관련 문제