2012-12-10 4 views
0

현재 PHP에서 구축 된 프로젝트에 문제가 있습니다. & MySQL. 프로젝트 자체는 온라인 입찰 시스템과 유사합니다. 사용자는 프로젝트에 입찰하고 클릭하고 다시 클릭하여 입찰가를 따를 경우 우승 할 수있는 기회를 얻습니다.MySQL 및 UNIX_TIMESTAMP 삽입 오류

예를 들어 5 명의 사용자가 동시에 게임을 입력하면 데이터베이스가 8-10 초 지연됩니다. UNIX_TIMESTAMP (CURRENT_TIMESTAMP)를 사용하여 데이터베이스를 업데이트하면 전체 쓸데없는 입찰 시스템.

내가 너무 프로젝트가 언급하려는 집중적 매우 데이터베이스와 내가 어쩌면 쿼리가 지연받을 생각했다,하지만 난 그게 무슨 일이 일어나고 있는지 확실하지 않습니다 (30 ~ 40 개 페이지 당 쿼리 정도). 그렇다면이 유형의 문제를 피하는 방법은 무엇입니까?

희망이 문제로 적어도 분명했습니다. 그것은 나에게 처음 발생한 일이고 나는 당신의 도움에 감사 할 것입니다!

+0

귀하의 질문은 다소 모호하지만 최적화가 필요한 실행 속도가 느린 쿼리가있는 것 같습니다. 느린 쿼리 로그를 사용하려고합니다. http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html –

+1

PHP에서 현재 타임 스탬프를 계산하고 데이터베이스에 삽입하는 것은 어떻습니까? 그런 다음 데이터베이스 지연은 중요하지 않습니다. –

+2

이것은 매우 모호합니다. 몇 가지 코드로 질문을 지원하십시오. – Kermit

답변

0

당신은

  1. 이 최적화 또는 필요한 쿼리를 최소화 결정할 수 있습니다.
  2. 쿼리를 캐시 할 때마다 방문 할 때마다 업데이트 할 필요가 없습니다.
  3. 당신은 변화에 여름 테이블을 쿼리를
  4. 업데이트를 사용할 수 있습니다.

당신은 영리하게이 작업을 수행 할 수 있습니다. 이 MySQLPerformanceBlog

0

난 당신이 무슨 일을하는지에 분명 아니지만, 내가 당신이 말한 것에 정교하게 따를 수 있습니다. MySQL 쿼리에서 UNIX_TIMESTAMP (CURRENT_TIMESTAMP())를 사용하는 경우 심각한 문제가 발생합니다.

당신의 접근 방식의 문제는 데이터베이스에 저장됩니다 타임 스탬프 기록을 공급하기 위해 MySQL의 기능을 사용하는 것입니다. 이것은 문제입니다. 그 이유는 타임 스탬프가 생성되기 전에 쿼리를 구문 분석하고 실행하기 위해 MySQL을 기다려야하기 때문입니다 (MyISAM과 같은 일부 MySQL 엔진은 테이블 수준 잠금을 사용합니다). InnoDB와 같은 다른 엔진은 로우 레벨 잠금 세분화로 인해 쓰기 속도가 느립니다. 즉, 행에 저장된 시간은 요청이 생성되어 해당 행을 삽입 한 시간을 반드시 반영하지는 않습니다. 또한 데이터베이스에서 읽는 시간이 가장 최신 레코드 ()가 테이블에 삽입 된 후 레코드를 업데이트한다고 가정 할 필요는 없음을 의미 할 수도 있습니다.

는 당신이 필요로하는 것은 SQL 쿼리에 직접 타임 스탬프를 제공하기 위해 SQL 쿼리를 생성하는 PHP 요청을위한 것입니다. 이것은 타임 스탬프가 요청이 PHP에 의해 수신 된 시간을 반영하고 행이 데이터베이스에 삽입/업데이트되는 시간을 반영하지 않는다는 것을 의미합니다.

테이블을 사용중인 MySQL 엔진에 대해서도 분명히 알고 있어야합니다. 예를 들어 InnoDB와 같은 엔진은 MVCC (다중 버전 동시성 제어)을 사용합니다. 이것은 행이 읽혀지는 동안 동시에 쓰여질 수 있음을 의미합니다. 이 경우 데이터베이스 엔진은 페이지 테이블이라는 것을 사용하여 새로운 값이 업데이트되는 동안 클라이언트가 읽을 기존 값을 저장합니다. 그렇게하면보다 빠르고 안정적인 읽기로 행 수준의 잠금을 보장 할 수 있지만 쓰기가 느려질 수 있습니다.