2016-08-05 3 views
0

나는 수백만 개의 행을 가진 하나의 테이블을 가지고 있으며 클라이언트의 hundres는 동시에이 테이블에 액세스하고 있으며, 각각은 20 개의 고유 한 행을 가져야하며, 마지막 행에 배치해야합니다.동시에 여러 클라이언트에 대해 고유 한 결과 제공

내 설정은 다음과 같습니다

테이블 구조 :

id | last_access | reserved_id | [Data columns] 
id + last_access is indexed 

나는 다음을 사용 (20 개)의 고유 행을 선택하는 경우 :

UPDATE "table" SET "reserved" = 'client-id_timestamp' WHERE "reserved" = ''ORDER BY "last_access" ASC LIMIT 20 

이 업데이트 쿼리가 매우 나쁜 성능 현명하다,이다 왜 내가 묻는 이유 :

내 요구 사항에 대한 더 나은 해결책이 있습니까? 다른 테이블 구조는 아마도?

+0

따옴표가 아닌 열 이름을 사용하여 백틱을 사용합니다. 따옴표는 문자열을 나타냅니다. –

+0

그것은 단지 예 였지만 어쨌든 언급했습니다. – Jeppe

답변

1

last_access는 날짜 열입니까? 정수 값 (즉, 1970-01-01 년 이후의 초)으로 표현하려고하면 정렬하는 것이 더 빠를 수도 있습니다.

두 번째 성능 문제는 "예약 된"필드를 변경 한 후 테이블을 다시 인덱싱해야 할 필요가있을 수 있습니다. 해당 열에서 색인을 제거하면 성능이 향상 될 수 있습니다. 수색에 시간이 더 걸릴 것이지만, 더 비싼 재 색인은 방정식에서 버려집니다.

MySQL 5.6.3 이상을 사용하는 경우 쿼리를 사용하여 EXPLAIN을 실행하면 가장 길게 걸리는 부분을 확인할 수 있습니다.

+0

실제로 예약 된 열의 색인을 제거하고 성능 문제를 해결했습니다. 감사합니다! 이 시나리오를 처리하는 방법에 대한 더 나은 해결책이 있어야한다고 생각합니까? 행 수가 증가함에 따라 성능이 악화되고 있습니다. – Jeppe

+0

자세한 내용에서 수행하려는 작업을 취소 할 수 있습니다. 마지막 액세스 권한으로 주문해야하는 이유는 무엇입니까? 20 개를 제한하는 이유는 무엇입니까? 데이터 열을 별도의 테이블에 저장하고이 테이블을 최소로 유지하는 것이 도움이 될 수 있습니다. 훨씬 짧은 테이블 (100k 행)을 유지할 수도 있습니다. 개체에 액세스 할 때 해당 행을이 "캐시"테이블에 삽입/업데이트하고 일정 시간 간격으로 이전 항목을 삭제하는 제거 메커니즘을 갖습니다. –

+0

다시 색인하지 마십시오. 인덱스의 값을 변경하기 때문에 인덱스를 업데이트하는 것이 비용이 많이 들지만 전체 테이블을 다시 인덱싱하는 것은 훨씬 더 많은 비용이 듭니다. –

관련 문제