본문 바로가기

프로그래밍/mysql

mysql - 코드 힌트(조인순서, 인덱스 강제 사용)

반응형

문제를 쉽게 해결하기 위해 MySQL로부터 더 많은 정보를 얻는 기법들
 
MySQL 만의 기능들을 항상 주석처리함으로써 쿼리의 이식성 높일 수 있다. 

SELECT /*! SQL_BUFFER_RESULTS */ ... 

SELECT SQL_BUFFER_RESULTS ...
MySQL이 임시 결과 세트를 만들도록 강제한다. 임시 세트가 만들어지면, 그 테이블들에 대한 모든 잠금이 해제된다. 이는 테이블 잠금으로 인해 문제가 발생했을 때나 쿼리 결과를 클라이언트로 전송하는데 오랜 시간이 소요되는 경우에 도움이 된다.


SELECT SQL_SMAIL_RESULT ... GROUP BY ...
결과 세트가 적은 수의 레코드만 가지게끔 하도록 옵티마이저에게 지시한다.


SELECT SQL_BIG_RESULT ... GROUP BY ...
결과 세트가 많은 수의 레코드를 가지도록 옵티마이저에게 지시한다.


SELECT STRAIGHT_JOIN ...
옵티마이저가 FROM 절에 나타난 순서대로 테이블을 join 하도록 강제한다.


SELECT ... FROM table_name [USE INDEX (index_list) | IGNORE INDEX (index_list)] table_name2
MySQL이 특정 인덱스들을 사용하거나 무시하도록 강제한다. 


SQL_CALC_FOUND_ROWS

limit 절 이전단계의 값을 알고 싶을 경우에

SQL_CALC_FOUND_ROWS 를 사용하면 편리합니다.

 

member 테이블의 전체 갯수는 11,133개 인데 limit 조건절을 준 후 FOUND_ROWS()는 limit 값만큼

만 나오지만 select 절에 SQL_CAL_FOUND_ROWS 구문을 넣으면 전체 행이 출력됩니다.

 

mysql> select *  from member  limit 0,200;     

mysql> select FOUND_ROWS();                     
+--------------+                                       
| Found_Rows() |                                     
+---------------+                                     
|          200        |                                     
+--------------+                                      
1 row in set (0.00 sec)                              

 

 

mysql> select SQL_CALC_FOUND_ROWS * from member  limit 0,200;  


mysql> select FOUND_ROWS();                     
+--------------+                                       
| Found_Rows() |                                     
+---------------+                                     
|         11133      |                                     
+--------------+                                      
1 row in set (0.00 sec)                                 

 

 

반응형