2017-12-17 4 views
-1

현재 데이터베이스 테이블을 디자인하고 값을 업데이트/삽입하는 데 문제가 있습니다.
의 표에 의해 식별되는 집계 통계를 수집하는 데 사용됩니다MySQL에서 기본 키없이 값을 효율적으로 업데이트하는 방법은 무엇입니까?

  • 소스를
  • 사용자
  • 통계
  • 옵션 물질 (예를 들어, 항목 유형)
  • 옵션을 엔티티 (예 : 동물)

내 주요 문제는 제안 된 기본 키가 너무 큽니다. 통계를 식별하는 데 사용되는 VARCHAR이 있기 때문입니다.

나의 현재 테이블은 다음과 같이 생성된다 :

특히
CREATE TABLE `Statistics` (
`server_id` varchar(255) NOT NULL, 
`player_id` binary(16) NOT NULL, 
`statistic` varchar(255) NOT NULL, 
`material` varchar(255) DEFAULT NULL, 
`entity` varchar(255) DEFAULT NULL, 
`value` bigint(20) NOT NULL) 

상기 server_id가 구성되면, player_id는 UUID이다 statistic 마찬가지로, materialentity 변경할 수 열거의 표현이다. valueSUM()을 사용하여 집계되어 전체 통계를 계산합니다.

지금까지는 작동하지만 기본 키가 없기 때문에 언제든지 DELETEINSERT 문을 사용해야합니다. MySQL의 제약 조건에서 기본 키를 만드는 방법을 알 수 없습니다. .

내 질문은 :이 테이블의 값을 효율적으로 업데이트하고 현재 행이 없는데 삽입하면 모든 행을 삭제하고 새 행을 삽입하지 않고 어떻게 삽입 할 수 있습니까?

주요 문제는 MySQL이 기본 키에 설정하는 제한 사항 인 것 같습니다. 나는 id 컬럼을 추가하는 것이 이것을 해결할 것이라고 생각하지 않는다.

+0

업데이트 쿼리를 작성하는 데 문제가 있습니까? 그것은'WHERE' 조건의 어떤 조합도 포함 할 수 있으며'DELETE' 질의에 넣을 조건을 알고 있다면 이것들은'UPDATE' 질의에 사용하는 것과 같습니다. –

+0

@NicoHaase 주요 문제는 기본 키였습니다. 그러나 나는 이미이 문제를 해결했다. – GiantTree

답변

0

는 간단하게 자동 증가 ID를 추가

CREATE TABLE `Statistics` (
statistis_id int auto_increment primary key, 
`server_id` varchar(255) NOT NULL, 
`player_id` binary(16) NOT NULL, 
`statistic` varchar(255) NOT NULL, 
`material` varchar(255) DEFAULT NULL, 
`entity` varchar(255) DEFAULT NULL, 
`value` bigint(20) NOT NULL 
); 

짜잔를! 기본 키. 그러나 아마 당신은 지수를 원할 것입니다. 마음에 드는 것 :

create index idx_statistics_server_player_statistic on statistics(server_id, player_id, statistic)` 

코드에 따라 색인에 다른 키 또는 다른 키가 필요할 수 있습니다.

0

다음을 수행하여 문제를 해결하십시오. - - 먼저 변수를 사용하여 테이블에 돈으로 "세부 사항"을 입력하십시오. - 프로젝트에서 insert 문을 사용할 때 문을 사용하기 전에 최대 상세 정보 (SELECT MAX (detailed) +1)를 maxid FROM TABLE_NAME으로 가져옵니다 (레코드를 FETCH, DELETE하는 데 도움이되는 사용 번호로 사용하십시오.) - 당신은 또한

당신이 이해 바랍니다. 또한이 함께하지만 필요하지 않습니다 세부의 업데이트 MAXIMUM 동안 업데이트 할 수 있으며, 그것은 당신을 도울 것입니다.

0

나는 인터넷을 통해 더 많은 비트를 파고 내 코드 A를 최적화 된 제비.

성능이 좋지 않아서이 질문을했습니다. 그 이유는 서로 다음에 오는 DELETEINSERT 문 때문이었습니다.

나는 UPDATE 문 또는 INSERT .. ON DUPLICATE KEY UPDATE 문 다음에 INSERT IGNORE 문을 수행하여로드를 줄이려고 할 수 있다고 생각했습니다. 하지만 MySQL의 제약 때문에 내가 액세스 할 수 없었던 키가 유용해야합니다.

내가 비록 성능 문제를 해결 한

: 비동기 적으로 생성 된 문장의 양을 줄임으로써

이 자동 위탁 비활성화하고 (나는 JDBC 차단 알고 있지만 일, 그냥 스레드 만 차단) , 나는 성능을 번 (60 초에서 0.1 초까지) 향상시킬 수있었습니다.

다음 단계는 연결 문자열을 개선하고 더 많은 성능을 얻는 것입니다.