2017-01-05 1 views
1

를 가져 I이 글로벌 게임 통계를 업데이트 할 시간마다 실행 다음 크론 과정 :MySQL은 "연쇄 충돌"행

  • 는 각 통계에 대한 임시 테이블
  • 만들기 임시 테이블에 행을 삽입을 (합계 키
  • 자르기 주요 통계 테이블
  • 임시 테이블에서
  • 데이터를 복사 기본 테이블

가 L로, 사용자, 점수, 순위) ast 단계는 쿼리에 대규모 백 로그를 발생시킵니다. SHOW PROCESSLIST을 보면 복사가 완료 될 때까지 붙어있는 updating -status 쿼리가 나타납니다 (최대 1 분이 소요될 수 있음).

그러나 연속 쿼리 ID가 많아 질 경우 많은 쿼리가 제대로 완료되는 것과는 다릅니다. 그래서 그것은 거의 붙어있는 "쓰레드"처럼 보입니다. 또한 노트의 붙어 업데이트

그래서 지속적인 사본 공통점 (다른 테이블 등)가 없다는 것입니다 :

  • 내가 크론 전용 "스레드"에서 MySQL에 연결을 할 수 있도록 자사의 디스크 활동 (또는 그게 무엇이든간에) 다른 업데이트를 잠그지 않습니다. 또는
  • 나는 무슨 일이 있는지 오해하고, 그렇다면 실제 사건이 무엇인지 어떻게 알 수 있습니까?

추가 정보가 필요하면 알려주세요.

+0

갇혀있는 프로세스는 무엇을 기다리고 있다고 말합니까? – Barmar

답변

1

MySQL 스레드의 이름이 완벽하지 않습니다. 예를 들어, Java 개발자라면 Java 지식을 기반으로 MySQL 스레드에 대해 잘못된 가정을 할 수 있습니다.

먼 거리에서 진단하기 어려운 이유 때문에 복사 단계로 인해 일부 쿼리가 완료되지 않습니다. 어떤 사람이 시도하는지 궁금하다면

SHOW FULL PROCESSLIST 

그리고 결과를 이해하려고 노력하십시오.

그동안 이러한 시간별 통계를 새로 고치는 방법은 약간 다를 수 있습니다.

  1. 11am 업데이트의 경우 stats_11과 같은 새 임시 테이블을 생성하십시오. 해당 이름의 테이블이 이미 존재하면 먼저 이전 테이블을 삭제하십시오.
  2. 필요에 따라 테이블을 채우십시오.
  3. 필요한 인덱스를 추가하십시오. 테이블을 채우는 동안 인덱스가 제자리에 있지 않으면 테이블을 채우는 것이 더 빠를 때가 있습니다.
  4. create or replace view stats as select * from stats_11

다음 시간은 stats_12와 동일한 기능을 수행. 아이디어는 거의 항상 유효한 통계 테이블을 가리키는보기 stats을 갖는 것입니다.

통계표 작성 작업 시간이 단축됩니다.작업이 완전히 테이블을 다시 작성하는 경우

+0

재미 있습니다. 그래서 주어진 시간에 테이블을 만들고 뷰를 업데이트하십시오. 사용자 ID 등을 참조하는 외래 키는 어떻게 작동합니까? –

+0

이전 : 1 분. 이후 : <5ms. 그래, 나는 그것을 해결했다고 생각해. –

0

이 최고입니다 : 테이블 real 항상 사용할 항상 행의 완전한 세트를 가지고 있기 때문에 제로 간섭이

CREATE TABLE new_stats LIKE stats; 
... fill up new_stats by whatever means ... 
RENAME TABLE stats TO old_stats, new_stats TO stats; 
DROP TABLE old_stats; 

. (OK, RENAME은 소량의 시간이 걸립니다.)

아니요 VIEWs도 TEMPORARY 테이블도 아니고 데이터를 복사하지 않고 24 개의 테이블이 필요 없습니다.

시간당보다 "계속적으로"작업을 수행하는 것이 좋습니다. 테이블이 너무 커서 시간별 cron 작업이 1 시간 이상 걸리면이 기능이 특히 유용합니다!