2016-11-22 6 views
1

은 내가 MySQL의에서 UUID의 1 차 키를 사용하여 성능에 관한 온라인 기사의 몇 읽었습니다.비 순차 (예 : UUID/GUID) 데이터가 인덱스 성능을 저하시키는 이유는 무엇입니까? 그들이 또는-에 대한이 비 순차적 데이터를 인덱스 성능 아파한다는 생각인지, 그리고 공통 주제 -

https://blog.codinghorror.com/primary-keys-ids-versus-guids/

생성 된 GUID는 최적의 성능을 위해 부분적으로 연속되어야

https://www.percona.com/blog/2014/12/19/store-uuid-optimized-way/

UUID 필드를 재정렬하는 방법을 정리 UUID를 도시 한 후에 (그것을 사용하는 기능을 만들기 성능을 획기적으로 향상 시킴)

그러나, 나는 비 순차적 데이터가 B-TREES, HASHES, CLUSTERED 인덱스과 같은 인덱스에 어떻게 영향을 미치는지 간단하게 이해할 수 없습니다.

답변

1

당신은 목록에 my UUID blog를 추가 할 수 있습니다. (MySQL에도 똑같이 적용됩니다.)

클러스터링 여부에 관계없이 또는 BTree, 해시 또는 기타 여부와 상관없이 인덱스가 RAM에 캐시 되기에는 성능 문제가 발생하지 않습니다. 그 시점에서 "다음"UUID에 도달하거나 삽입하려고 시도하면 RAM에있을 가능성이 적어 I/O가 필요하므로 성능에 영향을줍니다.

는 반대로 삽입 행 날짜 시간 키잉 등 다소 시간적하고, 주로 BTREE의 동일한 블록으로 삽입된다. 즉, "다음"행은 입/출력이 필요한 일 가능성이 낮습니다.

I/O는 성능에 가장 큰 요인이다.

내 블로그는 유형 1 uuids가 타임 스탬프와 비슷한 것으로 바뀌어 I/O가 적어 속도가 빨라지는 "참조 지역"을 달성 할 수 있다고 지적했습니다. MySQL 8.0은 My Stored Functions와 같은 기능을 내장하고 있습니다. 그래도 I/O를 줄이기 위해서는 유형 1 이 필요합니다.

+0

그래서 문제는 '비 순차적'하지만 '비 연대 기적'이 아니다. – EJP

+0

@EJP - 어느 쪽이든 - 나는 "다음 키가 어디에서"무작위 "인지를 선호하지 않습니다. 다른 경우가 있습니다. 그것은 잘 작동합니다. 저는 10 개의 위젯을 가지고 있으며 각각에 대해 새로운 행을 무작위로 로깅하고 있습니다. INSERT는 10 개의 "핫스팟"사이를 뛰어 넘고 각각에 몇 개의 행을 삽입합니다. 10 핫스팟은 괜찮습니다. 1 핫스팟 (auto_inc)은 정상이지만 백만 점이 너무 "무작위"입니다. –

+0

진짜 질문은 "내 다음 작업에서 캐시에 필요한 블록을 찾을 수 있습니까?"입니다. 가능한 블록이 적 으면 캐시에있을 확률이 높습니다. –