mysql order by equal?
mysql order by column 시
column value가 같을 경우, sort 순서는 보장되지 않는다. (결과값이 달라질 수 있다.)
왜?
쉽게 생각해서 table에 저장된 row순으로 출력 되지 않을까 싶은데,
실제로는 table의 row는 disk에 순서대로 저장되지 않고,
insert, delete, update 를 거치면서 물리적으로 저장된 순서가 바뀔 수 있고,
그것보다는 order by 사용시 index를 사용하지 못하는 경우,
filesort 알고리즘을 이용하게 되는데 해당 알고리즘은 정렬 수행 시
메모리에 임시 테이블을 만들거나, 너무 커서 메모리에 저장 못하면,
메모리가 아닌 디스크에 쓴 뒤 (일부 sort → merge) 반복 동작이 수행되는데,
merge 작업 시 순서가 보장되지 않을 수 있다? 고 한다.
filesort 란?
mysql 엔진이 스토리지 엔진으로부터 받아온 데이터를 정렬할 때 사용하는 알고리즘
인덱스를 이용할 수 없다면 filesort 이용
filesort의 경우 mysql엔진이 메모리 상에서 임시 장소(sort buffer)에서 스토리지 엔진으로 땡겨온 결과 값을 정렬하게 된다. sort buffer 상의 결과들을 sort → merge 작업을 수행하기 때문에 순서가 보장되지 않고, 보장하기 위해서는 order by 절에 다른 column을 지정해야 한다.
* 주의
상기의 내용은 스택오버플로우와 블로그 등에서 조각모음 하듯이 찾아낸 내용으로 속 시원하게 정확한 내용이 써진 reference를 찾지 못했기 때문에 부정확할 수 있음. 마치 gpt처럼...
ref)
1. https://dba.stackexchange.com/questions/283460/does-mysql-order-by-guarantees-to-give-the-same-order-for-the-same-query-every
2. https://stackoverflow.com/questions/24042571/mysql-order-by-strange-sorting/24043640#24043640
3. https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html
4. https://engineering.linecorp.com/ko/blog/mysql-workbench-visual-explain-index
5. https://stackoverflow.com/questions/17923593/orderby-clause-is-resulting-different-result-sets-when-order-column-having-same
6. https://enterone.tistory.com/233
7. https://dba.stackexchange.com/questions/120961/mysql-order-by-is-equal-in-what-order-are-the-results-returned