SQL 2016. 9. 21. 12:25

MySQL GUID 저장 팁

대시 기호 제거 후 UNHEX() 함수를 사용하여 16바이트 숫자로 변환 후 BINARY(16) 칼럼에 저장, 해당 값은 HEX() 함수를 이용하면 16진수로 볼 수 있다.


일반적으로 CHAR(32)에 저장했을 때보다 저장 용량이 절반으로 줄어들고 비교 속도가 빨라진다.

SQL 2016. 8. 12. 16:45

MySql에서 내림차순 정렬 인덱스 사용하기

현재 프로젝트에서 사용 중인 MySql에서 내림차순 인덱스를 지원하지 않는다.


내림차순 정렬 후 페이지 단위로 셀렉트해야하는 경우 오름차순으로 정렬된 인덱스 때문에 내부적으로 불필요한 정렬이 계속 발생한다.


그러면 어떻게하면 되느냐.. 그냥 MSSql을 사용하자.. 


그럴 수 없다면 꼼수를 사용하면 되는데..



DateTime 형식의 내림차순 인덱스를 만든다고 한다면 위의 그림을 참고하자.



Min, Max는 DateTime 형식의 Min, Max 값을 생각하고 숫자 1, 2번은 데이터 발생 시점으로 생각한다면,


일반적으로 RegDateTime가 오름차순으로 구성되어 있을 것이고 (내림차순 인덱스가 지원되지 않는다) 필요한 데이터를 내림차순 정렬 후


페이지 단위로 셀렉트한다면 DBMS에서는 정렬 후 해당 페이지 단위만큼 셀렉트할 것이다.


당연히 복합 인덱스 컬럼이 오름차순으로 셋팅되어 있다면 이후에 발생한 2번이 두번째에 구성되는게 맞다. 


그러면 여기서 바라보는 시각을 비틀어 발생 시각이 아니라 Max까지 남은 시간을 생각해보면, 2번 데이터가 발생한 시점에 Max까지 


남은 시간 3번이 4번보다 더 적은 것을 알 수 있을 것이다.


답은 나왔다. 인덱스 컬럼을 3, 4번으로 사용하면 오름차순 인덱스만 지원하는 MySql의 특성을 만족 시키면서 필요한 데이터를 내림차순으로


얻을 수 있다. 


정렬 키를 만드는 C# 코드

TimeSpan spanTime = DateTime.MaxValue - DateTime.UtcNow;

DateTime orderByKey = DateTime.MinValue + spanTime;



정렬이 발생하지 않는 내림차순 페이지 단위 셀렉트 MySql 쿼리


SELECT

....

FROM table

WHERE Guild_SN = pGuildSN

ORDER BY OrderByKey

LIMIT pStartIndex, pPageSize;


DBMS에서 정렬이 발생하면 왜 안되는지는 찾아보면 아래 링크


링크 : 정렬이 왜 나빠?