1

현재 테이블에 값을 가져 와서 "정상화"하도록 MySQL에 저장 프로 시저를 작성했습니다. 즉, 저장 프로 시저에 전달 된 각 값에 대해 값이 이미 테이블에 있는지 여부를 확인합니다. 만약 그렇다면, 그 행의 id를 변수에 저장합니다. 값이 테이블에 없으면 새로 삽입 된 값의 ID를 저장합니다. 스토어드 프로시 저는 id를 취하여 원래의 비표준화 된 테이블과 동일한 테이블에 삽입하지만이 테이블은 완전히 정규화되고 주로 외래 키로 구성됩니다.MySQL 정규화 저장 프로 시저 성능

이 디자인의 문제점은 저장 프로 시저가 약 10ms 정도 걸리므로 약 10million 레코드를 처리 할 때 너무 길다는 것입니다. 내 의구심은 퍼포먼스가 내가 인서트를하는 방식과 관련이 있다는 것이다. 즉

INSERT INTO TableA 
(first_value) 
VALUES 
(argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id); 

SET @TableAId = LAST_INSERT_ID(); 

를 "ON DUPLICATE KEY UPDATE는"때문에 중복 키에 난 아무것도 업데이트가 아니라 단지 행의 id 값을 반환하고 싶지 않은 사실, 해킹의 비트입니다. 이 단계를 놓친 경우 LAST_INSERT_ID() 함수는 "SET ..."문을 실행하려고 할 때 잘못된 값을 반환합니다.

누구든지 MySQL에서 더 좋은 방법을 알고 있습니까?

답변

2

내가 다시 사라지고 대신이 사건을 처리하는 함수를 만들었습니다 : 앞서 언급 한

CREATE DEFINER=`root`@`%` FUNCTION `value_update`(inValue VARCHAR(255)) RETURNS int(11) 
BEGIN 
     DECLARE outId INT; 
     SELECT valueId INTO outId FROM ValuesTable WHERE value = inValue; 

     IF outId IS NULL THEN 
       INSERT INTO ValuesTable (value) VALUES (inValue); 
       SELECT LAST_INSERT_ID() INTO outId; 
     END IF; 

     RETURN outId; 
END 

저장 프로 시저 대신 INSERT 문 자체를하는이 함수를 호출합니다. 성능면에서 위의 함수는 (ndb 테이블 유형을 사용하는) 설정에서 빠릅니다. 또한 응용 프로그램의 모든 부분을 벤치마킹 한 결과 성능 문제가 전반적인 성능 병목 현상의 일부에 지나지 않음을 발견했습니다.

0

이미 고유 한 식별자가있는 경우 자동 증가 기본 키가 있어야합니까?

+0

고유 식별자는 그렇지 않으면 VARCHAR 필드입니다. 성능상의 이유로 정수 필드를 선호합니다. – srkiNZ84

+0

고유 식별자는 여전히 varchar 필드입니다. 당신이 한 것은 테이블에 다른 컬럼과 또 다른 유일한 인덱스를 추가하는 것뿐입니다. 정수 고유 식별자는 아무런 목적도 가지고 있지 않으며, 느려지지 않을 것입니다. 응용 프로그램의 모든 부분을 벤치마킹하는 것은 좋은 생각이었으며, 중요한 사항에 집중할 수있게되었습니다. –