본문 바로가기
APM

mysql limit 처리, ANSI ↔ utf-8 변환, 인코딩 한글깨짐 해결방법

by JUNG-2503 2024. 2. 16.
  1. mysql limit 처리
  2. ANSI ↔ utf-8 변환, 인코딩 한글깨짐 해결방법  

 

mysql limit 처리

 

mysql 페이징 쿼리 정리한 내용 


페이징 처리시 limit를 사용하는데, 데이타가 많아질 수록 실행 속도가 느려짐.
아래 자료는 데스크탑에서 실행했을때 처리 속도임.

 
테이블 만들기

CREATE TABLE IF NOT EXISTS sample_memo (
m_idx INT( 11) unsigned not null auto_increment,
m_name varchar(50) not null ,
m_email varchar(100) not null ,
m_pass varchar(50) not null ,
m_memo TEXT not null ,
m_ip varchar(15) not null ,
m_regdate datetime not null,
primary key (m_idx)
); 


쿼리를 엑셀에서 10만건 생성 후 memo.sql로 저장
insert into sample_memo (m_name,m_email,m_pass,m_memo,m_ip,m_regdate) values ('방문자', 'test@test.net', password('1111'), '60001번째 방문중입니다.', '127.0.0.1', sysdate());

 

cmd에서 10만건 자료 등록
mysql -uroot -p123456 bbs < memo.sql 

 

2만건 자료 중 마지막 10개 가져오기


SELECT * FROM sample_memo ORDER BY m_idx DESC LIMIT 19990, 10;
0.22sec

 

select * from sample_memo where m_idx <= (select m_idx FROM sample_memo order by m_idx desc limit 19980,1) order by m_idx desc limit 10;
0.01sec

 

ROWNUM 구현
select * from ( SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.* FROM ( SELECT * FROM sample_memo ) t, ( SELECT @RNUM := 0 ) R) c where c.ROWNUM BETWEEN 19990 AND 20000;
0.12sec


10만건 자료 중 마지막 10개 가져오기 

 

1.인덱스를 알면 가장 빠름, 하지만 현실적으로 어려움이 있음
select * from sample_memo where m_idx <= 99990 order by m_idx desc limit 10;
0.00sec

 

2.일반적인 Limit 
SELECT * FROM sample_memo ORDER BY m_idx DESC LIMIT 99990, 10; 
1.04sec 

 

3.현재 사용중인 쿼리 (1번과 2번 중간)
select * from sample_memo where m_idx <= (select m_idx FROM sample_memo order by m_idx desc limit 99980,1) order by m_idx desc limit 10;
0.04sec 

 

4.ROWNUM 구현시
select * from ( SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.* FROM ( SELECT * FROM sample_memo ) t, ( SELECT @RNUM := 0 ) R) c where c.ROWNUM BETWEEN 99990 AND 100000;
2.31sec

 

5.Join사용(3번과 비슷한 처리속도) 
select * from sample_memo inner join (select m_idx from sample_memo  order by m_idx desc limit 99980, 10) as lim using(m_idx);
0.04sec


50만건 자료 중 마지막 10개 가져오기 

1.인덱스
select * from sample_memo where m_idx <= 499990 order by m_idx desc limit 10;
0.00sec

 

2.일반적인 Limit 
SELECT * FROM sample_memo ORDER BY m_idx DESC LIMIT 499990, 10; 
4.15sec  

 

3.현재 사용중인 쿼리 (1번과 2번 중간)
select * from sample_memo where m_idx <= (select m_idx FROM sample_memo order by m_idx desc limit 499980,1) order by m_idx desc limit 10;
0.17sec 

 

4.ROWNUM 
select * from ( SELECT @RNUM := @RNUM + 1 AS ROWNUM, t.* FROM ( SELECT * FROM sample_memo ) t, ( SELECT @RNUM := 0 ) R) c where c.ROWNUM BETWEEN 499990 AND 500000;
2.40sec

 

5.Join사용 (3번과 비슷한 처리속도)
select * from sample_memo inner join (select m_idx from sample_memo  order by m_idx desc limit 499980, 10) as lim using(m_idx);
0.17sec 

 

 

ANSI ↔ utf-8 변환, 인코딩 한글깨짐 해결방법

 

[PHP] ANSI ↔ utf-8 변환, 인코딩 한글깨짐 해결방법 

 

utf-8 세팅된 DB에서 파일이름을 불러오고, 파일은 저장된 폴더에서 불러와서 다운로드를 처리하는 부분에 문제가 발생 했습니다. 

다운로드한 한글 화일명이 정상적으로 출력되지 않았습니다. 

 

euc-kr은 정상적으로 출력되어 어쩔수 없이 변환 해야 했습니다.

 

utf-8 => euc-kr

$original = iconv("UTF-8","EUC-KR", $original); 

 

위와 같이 적용할 수 있었습니다.

 

반대의 경우는 테스트 해보지 않았는데, 가능할 것으로 생각됩니다.

반응형