반응형
최근에 본의아니게 SQL을 가지고 열심히 씨름중인데..
이번에 랜덤하게 row를 가져와서 사용할 일이 생겼다..
5만개 조금 넘어가는 row 였는데, 다른 블로그에서 가이드 준 대로 진행하보니 뭔가 문제가 있어 보였다.
SELECT * FROM TEST ORDER BY RAND() LIMIT 10
먼저 TEST 라는 테이블에서 랜덤한 로우를 10개 가져오는 것인데,
위 쿼리로 하게되면 엄청나게 시간이 오래 걸린다.. 물론 위에는 내가 TEST로 썼지만, 실제 업무용 테이블은 텍스트가 많아서 그런지 더 그랬고.. 실제로 15초 이상이 걸렸다.
해당 문제는 단순하게 * 이 아니라 특정 컬럼을 하나 지정하면 바로 수정되긴 하더라.. 아마 텍스트가 엄청 나게 많았던 컬럼 때문에 그런거 같은 느낌..
SELECT TEST_COL FROM TEST ORDER BY RAND() LIMIT 10
위 쿼리처럼 특정 컬럼으로만 조회하면 문제가 되진 않더라..
여기서 사람들이 한번 더 성능적인 측면을 고려하여 쿼리를 짜던데.. 커버링 인덱스라고 하더라
( 자세한 내용은 여기에 잘 설명되어 있어서 링크를 남깁니다.! https://jojoldu.tistory.com/476 )
SELECT A.TEST_COL1, A.TEST_COL2
FROM TEST AS A
JOIN (
SELECT DRUG_CD FROM TEST
WHERE TEST_COL1 IS NOT NULL
ORDER BY RAND() LIMIT 10) AS B
ON A.TEST_COL1 = B.TEST_COL1
TEST_COL1 이 INDEX 라고 할때 해당 쿼리가 커버링 인덱스를 사용한 쿼리가 된다고 한다...
( 된다고 한다고 표현하는게 맞을 것 같다.. 저도 아직 잘 모르겠는.. )
DB 하시는 분들, SQL 하시는 분들 대단합니다...
반응형
'Develop > Database' 카테고리의 다른 글
mysql ) Can't connect to local MySQL server through socket '/tmp/mysql.sock' (0) | 2019.05.24 |
---|---|
데이터베이스 원격접속 허용 (0) | 2019.05.24 |