개요 : MySQL은 NOT NULL 컬럼에 '' 과 ' ' 입력을 허용하여서 정제되지 않은 데이터의 경우나 개발자들이 '' 을 입력하고 조회에 조건으로 사용하는 경우가 있으므로 아래와 같이 조회되는 방법과 차이점을 알아두자.

'' : 공백 , ' ' : 스페이스 라고 하자.

 

create table test(
col1 varchar(20),
col2 varchar(20));

insert into test values('', '111');
insert into test values(' ', '112');
insert into test values('  ', '113');
insert into test values('  a a ', '114');
insert inot test values('a a', '115');
insert into test values('222', '116');

select * from test; -- 임의로 '(싱글쿼테이션) 사용해서 결과 표시
col1      | col2 |
------------------
''        |  111 |
' '       |  112 |
'  '      |  113 |
'  a a '  |  114 |
'a a'     |  115 |
'222'     |  116 |
------------------

select ascii(''), ascii(' ');  -- 공백: 0,  스페이스 : 32
select * from test where col1 = '';
col1      | col2 |
------------------
''        |  111 |
select * from test where ascii(col1) = 0;
col1      | col2 |
------------------
''        |  111 |
select a.*, ascii(col1), ascii(trim(col1)), ascci('a'), instr(col1,' ') from test a where ascii(col1) = 32; -- 첫 문자 스페이스 있는 데이터 모두 출력
col1      | col2 | ascii(col1) | ascii(trim(col1)) | ascii('a') | instr(col1,' ') |
-----------------------------------------------------------------------------------
' '       |  112 |          32 |                 0 |         97 |              1  |
'  '      |  113 |          32 |                 0 |         97 |              1  |
'  a a '  |  114 |          32 |                97 |         97 |              1  |
select * from test where col1 = ' ';
col1      | col2 |
------------------
' '       |  112 |
select * from test where trim(col1) = '';
col1      | col2 |
------------------
''        |  111 |
' '       |  112 |
'  '      |  113 |

개요 : 개별 적으로 돌릴 때는 해시 조인으로 풀리는 것이 LEFT JOIN 의 인라인 뷰로 쓰이니깐 NL 조인으로 변경된다.

결론 : LEFT JOIN 절의 인라인뷰의 맨 마지막 줄에 LIMIT n (최대 건수 or 그이상값) 을 적어 주어 쿼리 변환을 방지하고 인라인뷰만 보고 최적화된 실행계획을 수립하게 된다. 

 

LEFT JOIN ( SELECT ..
              FROM A
             INNER JOIN (SELECT COL1, MAX(SEQ_NO) AS MAX_SEQ_NO
                           FROM B 
                          WHERE B.SID IS NULL
                          GROUP BY B.COL1)
                ON A.COL1 = B.COL1 AND A.COL2 = B.MAX_SEQ_NO
             LEFT JOIN (SELECT ST_CD, FL_CD, MAX(SEQ_NO) AS MAX_SEQ_NO
                         FROM C
                        WHERE STATUS_CD='02'
                        GROUP BY ST_CD, FL_CD)
                ON ..
             WHERE ..
             LIMIT 1000000000  /*쿼리변환 방지, 뷰안에서 최적의 실행계획 실행, 뷰따로 실행*/
           ) V_ABC
       ON ..
  ORDER BY ..

'MySQL > 튜닝' 카테고리의 다른 글

MySQL slow_log  (0) 2025.03.13
MySQL 페이징 쿼리(GROUP BY)  (0) 2025.02.13
MySQL 카디널리티 기반 인덱스 선택 문제  (0) 2025.02.07
MySQL 페이징 처리(ORDER BY)  (0) 2025.02.07
MySQL PK를 고려한 INDEX 생성  (0) 2025.02.07

+ Recent posts