선착순 출석체크, firefinger 개발 중 고민

복불복에 대해 회의한 뒤 생긴 고민
→ 조회할때마다 동시 출석자의 순서가 바뀔 수도 있지 않을까?
생각의 오류
API 를 여러번 조회해보았을때, 동시 출석자의 순서는 바뀌지 않았다.
나는 이것이 mysql 내부에서 데이터를 정렬하는 로직에 있어서 “어떠한 규칙”을 통해 조회되기 때문이라 생각했다.
하지만..! 나의 생각은 일부는 맞고 일부는 틀렸다. 왜냐하면 mysql 은 데이터를 조회할때, 인덱스 정렬 또는 파일정렬을 사용하는데 추가로 캐싱을 사용한다.
첫번째 실행에서 쿼리 결과를 캐싱하고, 이후 실행에서도 동일한 정렬을 유지한다.
그렇기때문에 내가 시도 했던 여러번의 api 조회에서는 같은 updated_date를 가진 데이터들이 특정 실행환경에서 동일한 순서로 나온것이었다.
순서가 보장되지 않는 경우
Mysql 의 정렬방식과 캐싱을 통해서 데이터의 순서가 보장되지 않는경우를 생각해볼 수 있다.
Mysql 내부 정렬 방식이 최적화되면서 결과 순서가 변할 가능성.
지금 당장은 updated_date 의 순서가 유지 되지만, 이후 데이터가 증가하거나 Mysql 내부 정렬 방식이 변경되면 결과가 달라질 수 있다.
file sort를 사용하는 경우
말그대로 데이터를 가지고 정렬하는것이기 때문에 동일한 데이터의 경우 조회하는 순서가 바뀔 수 있다.
순서가 보장되는 경우
index sort 를 사용하는 경우
index sort란, Mysql 이 order by를 처리할 때, 테이블의 인덱스를 활용하여 데이터를 정렬하는 방식이다.
file sort로만 정렬하는것이아니라 index sort 를 정렬기준에 추가하는 경우
Mysql explain
→ 설명해줘~!
mysql 이 어떤 정렬을 사용해서 데이터를 가져오는지 explain 키워드를 통해 알 수 있다.
EXPLAIN SELECT *
FROM attend
WHERE attend_program_id = 113
AND attend_status = 'ATTEND'
ORDER BY updated_date ASC
LIMIT 10;
그럼 파이어 핑거의 기존 쿼리는 어떤 정렬을 사용할까?

Using fileSort → 파일 정렬이 사용됨
Using index → 인덱스를 사용하여 정렬
파이어핑거의 쿼리는 “Using filesort“로, 파일정렬이 사용되고 있었고, file sort 의 경우 데이터를 가지고 정렬하기 때문에 동일한 데이터를 조회시 동일한 조회순서를 보장하지 않는다.
Mysql show
만약 인덱스 정렬을 사용하고 있다면, 어떤것을 인덱스로 정하고 정렬하고 있는지 알려줘!
SHOW INDEX FROM attend;

attend_id, attend_program_id, attend_status를 인덱스로 사용하고 있다는것을 알수 있다.
앞으로의 방향
현재의 Fire finger 기능에서는 파일정렬을 사용하고 있으며, updated_date의 값을 기준으로 정렬하고 있기 때문에 Mysql 에서 캐싱값, 정렬 최적화가 달라질 경우 같은 등수에 대해 순서가 바뀌어 나올 가능성이 존재한다는 것을 확인했다.
이를 해결하기 위해서는 updated_date 외에, 인덱스 정렬을 사용할 수 있는 기준값을 추가하는것이 순서를 확실히 보장할 수 있다. 그렇기 때문에, 또다른 정렬 기준값인 순서 컬럼을 추가하고 2가지 기준으로 정렬하고자 한다.



