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로 이동했습니다. 그들 중 다수가 일회성 작업을 위해 충분히 빨리 일자리를 얻었습니다.
가 왜 필요합니까 :
은 슬러그 당신이 MySQL의에서이 같은 일을 할 수있는 자신의 이름의 연결 이름과 성이 될 것 "사용자"라는 가상 테이블의 모든 굼벵이를 업데이트하려면 DB에 슬러그를 저장 하시겠습니까? 당신은 id로 아이템을 찾고 슬러그를 동적으로 생성 할 수 있습니다. –사소한 개선 : 모든 이드를 IO로 보냈는지, 아마도 매 1000 분의 1 만에게 보냈습니다. 콘솔의 IO가 느리기 때문입니다. 가능한 큰 개선 : 순수 SQL에서 슬러그를 생성하십시오. 슬러그 형식과 데이터가 가능한지 여부에 따라 달라집니다. 또한 '슬러그'란에 인덱스가 있습니까? – spickermann
나는 돌아와서 며칠 전 어제 슬러그 칼럼에 색인을 추가하고 여기에 모든 것을 빠르게 만들어 준 답을 읽어 주었으면 좋겠다. 감사합니다! – viotech