2014-02-13 2 views
1

일부 탭을 탭으로 구분 된 값에서 가져온 후 일련의 업데이트를 수행하고 있습니다. 데이터에는 내가 좋아하지 않는 형식의 날짜가 있습니다. 나는 그들을 문자열로 가져 와서 MySQL 날짜와 같은 형식으로 변환 한 다음 컬럼을 변환합니다. 또는 때로는 아니지만, 문자열 인 경우에도 MySQL 날짜와 같아지기를 원합니다.r 표현 또는 대체 쿼리의 성능이 우수할까요?

그들은 '1/4/2013 12:00:00 AM'또는 '11/4/2012 2:37:45 PM '처럼 시작합니다.

이 항목을 '2013-01-04'로 변경합니다 (일반적으로 원래 스키마에서 날짜 만 명확하게 지정해도 시간이 있기 때문에). '2012-11-04 14:37:45'.

나는 등을 사용하고 있습니다. 그리고 이것은 인덱스를 사용하지 않습니까? 와우. 그거 끔찍해.

그러나 이미 각 열에 대해 서로 다른 사례 ('1/7', '2/13', '11/2 ', '12/24')를 처리하기 위해 4 개의 업데이트를 사용해야합니다. 만약 내가 이와 같이 사용하면, 각 열에 대해 16 가지 다른 업데이트가 걸릴 수 있습니다. ...

그리고 내가 올바르게 보았을 때, rlike 표현식에서 위치 매개 변수를 얻을 수 없습니다. 알다시피, 괄호 안에 $ 1 또는 $ 2가되는 표현식의 일부가 ....

그래서 perl로 tsv 파일을 사전 처리하는 것처럼 빨라지는 것처럼 보입니다. 정말? 와우. 다시 말하지만, 이것은 빤다.

다른 제안 사항이 있으십니까? 데이터를 가져올 때마다 3 시간이 걸릴 수 없습니다.

답변

1

리콜 제이미 자윈 스키의 고전 1997 인용구 :

Some people, when confronted with a problem, think "I know, I'll use regular expressions."
Now they have two problems.

당신이 STR_TO_DATE()를 사용하여 시도 적이 있습니까? 이는 비표준 날짜/시간 문자열을 표준 datetime 값으로 파싱하는 데 정확히 사용됩니다.

STR_TO_DATE()로 구문 분석을 시도하고 문자열이 예상 된 형식과 일치하지 않으면이 함수는 NULL을 반환합니다.

그래서 다른 형식으로 파싱 해보고 첫 번째 결과가 null이 아닌 결과를 반환 할 수 있습니다.

UPDATE mytable 
SET datecolumn = COALESCE(
    STR_TO_DATE(stringcolumn, '%m/%d'), 
    STR_TO_DATE(stringcolumn, '%d/%m/%Y'), 
    ...etc. 
); 

다른 사례가 무엇인지 알 수 없습니다. 모든 경우를 한 번에 처리 할 수도 있고하지 않을 수도 있습니다.

또 다른 대안은 MySQL에로드하기 전에 원시 데이터를 Perl로 사전 처리하는 것입니다. 그러나 그때조차 정규 표현식으로 싸우지 말고 Date::Parse을 대신 사용하십시오.

+0

수도 있습니다. 나는 Zawinski 인용문을 좋아한다. –

+0

글쎄, str_to_date() 함수도 그렇게 느리지 않았 으면 좋겠다. 8,143,764 개의 레코드를 업데이트하는 데 4 분 29.5 초가 걸립니다. 그 문자열에 대한 인덱스가 실제로 어떤 것도 속도를 낼 수 없다는 것이 합리적이라고 생각합니다. str_to_date를 더 빠르게 만드는 방법이 있는지 궁금합니다. 이 컴퓨터에 더 많은 RAM이 필요하지만 다른 것을 생각할 수는 없습니다. –

+0

Perl과 Date :: Parse로 시도해보고 원시 데이터를 적절한 MySQL 날짜 형식으로 전처리하는 것이 더 빠르는지 확인하십시오. –