2014-09-20 2 views
0

friendly_id 슬러그를 필요로하는 수백만 개의 엔티티가있는 데이터베이스가 있습니다. 엔터티를 저장하는 프로세스의 속도를 높일 수 있습니까? find_each(&:save)은 매우 느립니다. 초당 6-10에서 24/7을 실행하는 데 1 주일 이상 걸립니다.레일 4.1 - 많은 레코드를위한 친숙한 슬러그 저장

friendly_id 또는이 프로세스를 크게 향상시킬 수있는 병렬 처리 트릭에 메소드가 있는지 궁금합니다.

현재 나는 약 10 콘솔을 실행하고, 각 콘솔 내에서 값을 시작 해요 + 100,000 :

Model.where(slug: nil).find_each(start: value) do |e| 
    puts e.id 
    e.save 
end 

편집

잘 업데이트 가고 일으키는 가장 큰 것 중 하나 그래서 광의로 천천히 엔티티의 초기 찾기 쿼리가 아니라 레코드의 실제 저장됩니다. 나는 다른 날에 사이트를 라이브로 두었고, 서버 데이터베이스 요청을 계속해서보고 2000ms를 넘었고 범인은 @entity = Entity.find(params[:id])으로 5 백만 건 이상의 레코드가 가장 많이 발생했습니다. 슬러그 열에 인덱스가없고 활성 레코드가 슬러그 열의 SELECT 명령문을 사용하고 있다는 것을 알지 못했습니다. 올바르게 인덱싱 한 후 20ms의 응답 시간을 얻었고 위의 쿼리를 실행하면 초당 1-2 개의 엔티티에서 초당 1k로 이동했습니다. 그들 중 다수가 일회성 작업을 위해 충분히 빨리 일자리를 얻었습니다.

+1

가 왜 필요합니까 :

은 슬러그 당신이 MySQL의에서이 같은 일을 할 수있는 자신의 이름의 연결 이름과 성이 될 것 "사용자"라는 가상 테이블의 모든 굼벵이를 업데이트하려면 DB에 슬러그를 저장 하시겠습니까? 당신은 id로 아이템을 찾고 슬러그를 동적으로 생성 할 수 있습니다. –

+0

사소한 개선 : 모든 이드를 IO로 보냈는지, 아마도 매 1000 분의 1 만에게 보냈습니다. 콘솔의 IO가 느리기 때문입니다. 가능한 큰 개선 : 순수 SQL에서 슬러그를 생성하십시오. 슬러그 형식과 데이터가 가능한지 여부에 따라 달라집니다. 또한 '슬러그'란에 인덱스가 있습니까? – spickermann

+0

나는 돌아와서 며칠 전 어제 슬러그 칼럼에 색인을 추가하고 여기에 모든 것을 빠르게 만들어 준 답을 읽어 주었으면 좋겠다. 감사합니다! – viotech

답변

2

나는 이것을하는 가장 빠른 방법이 액티브 레코드를 사용하는 것보다 데이터베이스에 곧바로 갈 것이라고 생각한다. Sequel Pro와 같은 GUI를 가지고 있다면 데이터베이스에 연결하십시오 (세부 사항은 database.yml에 있습니다). 명령 행에 익숙하다면 데이터베이스 콘솔 창에서 직접 실행할 수 있습니다. 루비와 액티브 레코드는 이런 식으로 느리게 움직일 것입니다.

UPDATE users SET slug = CONCAT(first_name, "-", last_name) WHERE slug IS NULL 
+0

당신의 대답은 슬러그를 업데이트하는 훨씬 빠른 방법에 관한 나의 질문에 유효합니다. 어제 저의 작업을 끝내는 데 도움이되는 어제 굼벵이를 엄청나게 쇠약하게 만드는 원인을 발견했습니다. 자동 응답을 우회하여 다른 사용자가 자신의 슬러그를 업데이트하기 위해 friendly_id 콜백을 우회하는 데 도움이 될 수 있으므로 답변을 올바른 것으로 표시하십시오. – viotech