2016-11-02 2 views
0

로그를 저장할 필드가 MEDIUMTEXT 인 테이블이 있습니다. 로그 필드가 커짐으로 잘 작동 짧은 로그의읽지 않은 MySQL CONCAT

UPDATE tbl SET log = CONCAT(log, 'newtext') 

,하지만 시간이 지남에 따라, 그것은 기하 급수적으로 속도가 느려 다음과 같이
나는 로그에 데이터를 추가하고 있습니다. MySQL이 전체 필드를 읽고 나서 모든 것을 다시 쓰는 것 같습니다.

성능에 문제없이 로그에 데이터를 추가하려면 어떻게해야합니까? 이를 달성 할 수있는 방법이 없다면 텍스트 데이터의 큰 덩어리를 어떻게 저장하고 업데이트 할 수 있습니까? (내가 추측하고있어 이후

1 - Retrieve the existing value of `log`, 
2 - Concatenate the retrieved value with the new one, 
3 - Store the result of "2" back in the same row. 

(실제로는 짧은 손 형식에서 수행) : 당신이 생각하는 경우

답변

1

, 엔진이하고자하는 것이 매우 분명하다 여기에서는) 로그를 검사하고자 할 때 (정보를 추가하는 것보다 훨씬 빈번하게 발생하는) 전체 연결 이 필요하면 별도의 레코드에 정보를 저장하는 것이 좋습니다. 로그를 수집하고있는 특정 ITEM에 해당) 연결을 만듭니다. 필요할 때 nly (추출).

다이제스트에 포함 된 마지막 항목의 색인과 함께 임시 연결 (즉, 추출시 생성됨)을 저장하는 DIGEST 테이블을 갖춤으로써이를 향상시킬 수도 있습니다. 그런 다음 항목의 "전체 스토리"를보고 싶을 때마다 먼저 소화 된 텍스트를 추출한 다음 마지막으로 소화 된 값이 기록 된 후에 등록 된 것을 추가합니다 (물론 DIGEST 테이블을 최신으로 완전히 업데이트하십시오 연결 결과).

+0

단순히 1,2,3보다 나쁘다 - 이전 행을 제거해야하며 더 큰 새 행에 공간을 할당해야합니다. –

+0

귀하의 의견을 이해하는 @RickJames를 모르십니까? 성능 문제는 각 INSERT에서 발생하는 연결에서 발생합니다. 각 SELECT에 대해 INSERTS가 매우 많다는 가정하에 제안 된 방법으로 성능이 확실히 향상 될 것입니다 (이전에이 작업을 수행했으며 개선은 매우 중요 함). 내가 너를 완전히 오해 한 경우, 분명히 말하십시오. – FDavidov

+0

다른 말로 표현하기 - 3 단계는 표면에 나타나는 것보다 비용이 많이 든다. 저장 공간 (InnoDB 용 블록, MyISAM 용 스트림)으로 인해 더 큰 새로운 행을 저장하면 블록 분할과 다른 '비용이 많이 드는'작업이 발생할 수 있습니다. (우리는 합의에 도달했으며, 나는 당신의 대답을 좋아합니다.) –