MySQL과 SQLite 날짜 함수 비교

리눅스/MySQL|2015. 1. 16. 11:19
반응형

(mysql) 시간값 더하고 빼기

 

DATE_ADD(NOW(), INTERVAL-90 DAY); 

DATE_ADD(NOW(), INTERVAL+90 DAY); 

DATE_ADD(NOW(), INTERVAL+2 MONTH); 

...

 

(sqlite) 시간값 더하고 빼기

sqlite> select datetime('2000-01-01 00:00:00', 'weekday 1');
2000-01-03 00:00:00
sqlite> select datetime('2000-01-01 00:00:00', '-1 year');
1999-01-01 00:00:00
sqlite> select datetime('2000-01-01 00:00:00', '+09:00:00');
2000-01-01 09:00:00
sqlite> select datetime(946684800,'unixepoch');
2000-01-01 00:00:00
...

 

 

DATETIME, TIMESTAMP 비교

DATETIME    : '1000-01-01 00:00:00' ~ '9999-12-31 23:59:59'
TIMESTAMP : '1970-01-01 00:00:00' ~ '2037-12-31 23:59:59'
 
 
(mysql) timestamp <-> Date
timestamp -> YYYY-MM-DD
   select from_unixtime(timestamp);

YYYY-MM-DD -> timestamp
   select unix_timestamp('YYYY-MM-DD');
 
(sqlite) timestamp <-> Date
timestamp -> YYYY-MM-DD
   select datetime(timestamp, 'unixepoch');
YYYY-MM-DD -> timestamp
   select strftime('%s', '2008-07-01 02:15:00');

 

sqlite> select julianday('2000-01-01 00:00:00');
  2451544.5
sqlite> select strftime('%Y-%m-%d %H:%M:%S','2000-01-01 12:34:56');
  2000-01-01 12:34:56

 

(sqlite) datetime 함수에서 로컬타임 얻기

기본은 GMT값을 얻어오므로 다음과 해주어야 한다.

sqlite> select datetime(timestamp, 'unixepoch', 'localtime');

sqlite> select datetime('now', 'localtime');


 

 
 
 


반응형

댓글()

Mysql 효과적으로 사용하기 [2]

리눅스/MySQL|2015. 1. 16. 11:18
반응형
어떤 데이타베이스를 사용하던 가장 중요한 것은 쿼리를 얼마나 효율적으로 날리냐는 것이다.
쿼리에 따라서 속도의 차이기 많이 날 수도 있으니까.
 
mysql의 경우 상용 데이타베이스에 비해서 락이 잘 걸리는 편이다.
대부분 이것 때문에 많은 속도저하가 나오는 것을 확인했다.
 
 
3> 인덱스의 활용
 
대량의 DB를 돌려보시면 알겠지만 index는 검색과 삭제, 수정에 있어서 상당히 중요하다
 
서버에서 100만개의 데이타의 정렬을 테스트 해본 결과 index로 정력했을 경우 144.33초가 나왔고 그렇지 않은 경우는 211.54초가 나왔다..
물론 정렬한 데이타나 필스는 같았고 말이다.
 
이는 큰 차이는 아니지만 데이타의 량이 많을 수록 더 차이가 날 것이다.
 
또 index는 전체 데이타의 50%를 넘지 말라고 규정하고 있는데 이보다는 30%미만으로 정하는 것이 좋다는 것이 개인적인 생각이다.
또 varchar, text는 인덱스로 지정해봐야 큰 속도차를 느끼지 못하므로 인덱스로는 부적합하다는 생각이다.
 
인덱스는 int, char로 정하는 것이 좋다. varchar과 char이 똑같은 문자가 크기만 다를 뿐인데 먼 차이냐고 물을 수도 있지만 두가지는 작지만 큰차이를 가지고 있다.
두개가 같은 크기라도 다른 점은 똑같은 땅에 방을 만들어 놓았냐 아니냐의 차이 일 것이다.
 
varchar, char 둘다 크기가 5라고 하여도 varchar은 데이타가 들어오면 그때서야 들어온 데이타에 크기에 따라서 새로 방을 만들지만 char은 방은 이미 만들어져 있고 그안에 데이타만 들어가는 형식이니 말이다.
따라서 이미 방이 만들어져 데이타만 들어가는 쪽이 속도 처리에 있어 빠르기 때문에 인덱스로서의 활용이 높음을 알아야 한다.
 
 
4> 테이블의 설계
 
데이타베이스를 약간이라도 공부해 보신 분이라면 1, 2, 3 정규형이라고 들어 보았을 것이다.
물론 이런 것들은 실무에서 그다지 중요하지는 않지만 알아두어서 나쁠 것은 없다.
 
이부분은 다른 많은 서적에서 워낙 많이 설명이 되어 있다.
 
테이블을 어떻게 쪼개냐에 따른 구분이지만 속도에 따른 중요한 부분이기도 하다.
 
특히 대용량의 DB의 경우 속도를 높이기 위해서 조개는 경우가 상당히 많다.
 
특정키를 공통으로 하여 데이타를 쪼개고 볼때는 이러한 것들을 다시 붙이는 것인데..
검색할때 많이 유용하게 처리가 가능하다.
 
예를 들어 쇼핑몰의 경우 회원이 구매한 물건, 회원데이타, 주문정보, 상품 등으로 나누어져 있다..
 
만약 A란 회원이 2004년 1월 1일에 어떠한 물건을 구매했으며 회원의 정보도 알고 싶을 경우 어떻게 해야 할까?
 
처음 회원데이타를 통해 회원 여부와 아이디를 알아내고 아이디로 주문정보를 조회한 후 구매한 물건에서 어더한 물건을 구매했으며 그 구매한 물건은 어던 것인지 상품 테이블에서 확인을 해야 할 것이다.
 
만약 이러한 데이타가 하나의 테이블로 묶여있다면 데이타 량이 너무 많아 검색하는데 어려움이 있을 것이고 회원을 삭제하면서 주문정보나 상품등도 함께 삭제될 수 있는 문제가 생긴다.
 
물론 이런 테이블을 하나로 묶는 경우는 없겠지만 단적인 예를 들면 그렇다는 것이다.
 
이렇게 여러개의 테이블로 쪼개어 검색의 속도를 높이는 것이 아주 중요하다.
 
그렇다고 무식하게 너무 많이 나누는 것도 좋지 않으니 잘 판단하여 설계해야 하겠다.
 
 
5> 락을 줄이자.
 
인덱스나 테이블의 설계는 많은 분들이 신경을 쓰는 부분이다.
 
하지만 락에 대해서는 많은 분들이 중요성을 인식하지 못하는 경우가 많다.
 
mysql의 경우 오라클 처럼 필드단위의 락이 아닌 테이블 락이 걸리므로 속도에 아주 치명적이다.
 
특히 insert와 select가 빈번하게 일어나면서 량이 크다면 큰 문제이다.
 
본인의 경우에도 락의 중요성을 인식하지 못하다가 1000만개의 데이타 쯤에서 동시에 50명 이상이 데이타를 select하고 insert하는 과정에서 속도의 저하가 워낙 심해서 원인을 찾던 중에 알게 되었다.
 
insert의 경우에는 동시에 많이 해도 큰 문제가 없었으나 한 번 select 하면 데이타가 크다보니 시간이 걸리면서 락이 심해졌는데 이는 insert가 너무 많아 select를 시도하는 경우에도 반대의 경우보다는 아니지만 그런 현상이 발생했다.
 
이를 위해서 테이블을 많이 쪼개서 해결을 하였고 insert나 select 구문도 상당 수 개선 작업을 하였다.
 
insert의 경우 insert into Table(a,b,c) values(1,2,3)(2,3,4)(4,5,6) 의 형태로 바꾸었는데 이는 insert를 세번 하는 것이 아니라 한번에 처리하므로 속도의 새선에 많은 영향을 준것으로 생각된다.
 
물론 이경우도 동시에 100명 이상이 들어올 경우 문제가 가끔 발생하였지만 이러한 작업들로 조금 느리다는 생각만 들뿐 크게 문제가 없이 개선이 되었다.
 
우선 테이블을 쪼갤때 많이 신경을 썼던 것이 어떤 부분은 select를 많이 하냐는 것이었다.
또한 이미 처리가 완료되어 잘 사용하지 않는 데이타 들도 따로 보관하고 이러한 작업들을 많이 하였다.
 
이러한 부분들은 게시판에서 아주 효과적으로 사용할 수 있을 것으로 생각이 되는데..
오래된 게시물을 테이블을 분리하여 관리하고 자주 select되는 부분과 그렇지 않은 부분을 테이블을 분리하여 관리하는 것이다.
 
사실 일반 사용자들은 이런 한 것을 잘 모르므로 우선 보여주는 화면이 아닌 효율적인 관리가 되어야 한다는 것이다.
 
게시판의 경우 리스트시에 나오는 제목, 작성자, 조회수, 작성일은 자주 select 가 될 수 있다. 하지만 여기서 조회수는 update가 많이 되므로 따로 분리할 필요가 있다.
또한 내용도 다로 관리하여 테이블의 양을 적게 만든다.
 
이렇게 구성한다면 천만개의 게시물도 효과적으로 처리 할 수 있을 것이다.
 
그러나 게시판의 경우 특별한 경우가 아니라면 이러한 작업은 오히려 번거러울 수 있다는 것을 명심해야 한다.
대형사이트의 게시판이나 이렇게 관리할 필요성이 있겠지만 그렇지 않은 경우는 꼭 이런 작업을 할 필요성이 없음을 미리 밝혀둔다.
 
게시판을 예로 들었지만 게시판 보다는 다른 데에 더 큰 활용이 있을 것으로 생각된다.
 
본인은 리서치 데이타에 이러한 부분을 처리하였고 현재 속더에 거의 영향이 없이 사용하고 있다.
무슨 설문에 이런 처리를 하느냐 싶겠지만 문항이 30개 이상이고 복잡한 처리를 하는 경우라면 상당히 많은 데이타를 insert, select 하므로 꼭 필요한 작업으로 생각된다.
 
지금가지 설명한 내용은 스스로가 어떻게 응용하냐에 따라서 효과적이 될수도 아닐 수도 있음을 다시 한번 밝히며 이쯤에서 마무리 하겠다.
 
PS. 사실 일주일 단위로 강좌  혹은 팀을 올리려하는데 그다지 쉽지가 않다. 너무 게으른듯...
 
 
[출처] 아낌없이 주는 나무 | 마게님 (http://comager.blog.me/60040577018)


반응형

'리눅스 > MySQL' 카테고리의 다른 글

오라클 10g 설치하기  (0) 2015.01.16
MySQL과 SQLite 날짜 함수 비교  (0) 2015.01.16
Mysql 효과적으로 사용하기 [1]  (0) 2015.01.16
MD5, SHA-1, MySQL Pass 서로간의 변경  (0) 2015.01.16
MySQL 튜닝 query cache 설정  (0) 2015.01.16

댓글()

Mysql 효과적으로 사용하기 [1]

리눅스/MySQL|2015. 1. 16. 11:18
반응형

회사에서 mysql로 과도한 DB를 돌리면서 데이타베이스의 튜닝에 대해 관심을 가지게 되었다.
오라클 같은 경우는 대용량 데이타베이스로서의 활용능력이 좋아 대용량의 데이타를 돌려도 mysql에 비해서 좋은 성능을 낸다.


물론 mysql이 뛰어난 데이타베이스라는 것은 인정하나 아직은 대용량의 DB를 돌리기에는 무리가 있다.

오랜만에 강좌를 쓰면서 mysql을 어떻게 하면 효과적으로 대용량 DB로 활용할 수 있는 지를 이야기 해보겠다.

mysql의 튜닝에 관해서는 데이타베이스 사랑넷에서 많은 도움을 받았음을 미리 밝힌다.
사실 여기서 이야기하는 것은 단순한 설정을 통한 튜닝이며 보다 난이도 높은 튜닝은 컴파일 전 소스를 직접 만져야지만 가능한 부분이 있다.
그 부분에 대해서도 다루어 볼 생각은 있으나 아직은 그정도의 실력이 안되므로 그냥 넘어가고 후일을 기약해보겠다.

튜닝에 관현한 부분은 mysql의 공식 메뉴얼에도 자세하게 설명은 되어 있다.

10GB가 넘는 데이타를 돌리면서 쌓은 노하우를 공개해 보겠다...

그럼 서론은 이쯤에서 하고 본격적인 mysql을 이용하여 대용량의 데이타 베이스를 다루어 보겠다.

1> MYSQL 튜닝(?)

a. 설치 과정에서의 튜닝

mysql 메뉴얼에서는 컴파일 및 링크시에 정적(Static)로 하는 것이 속도를 더 빠르게 할 수 있으며 gcc보다 pgcc를 이용하여 컴파일 하는 것이 더 빠르며 TCP/IP보다 소켓을 이용하는 경우가 더 빠르다고 설명하고 있다.

메뉴얼에 적혀 있는 Full Configure Option은 다음과 같다.

CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro 
-felide-constructors -fno-exceptions -fno-rtti" ./configure 
--prefix=/usr/local/mysql --enable-assembler 
--with-mysqld-ldflags=-all-static


그래로 사용해도 무방하며 제가 사용하는 방법은 다음과 같습니다.

CC="/usr/local/pgcc/bin/pgcc" CFLAGS="-O6 -mpentiumpro 
-mstack-align-double -fomit-frame-pointer -march=pentiumpro" 
CXX="/usr/local/pgcc/bin/pgcc" CXXFLAGS="-O6 -mpentiumpro -march=pentiumpro 
-mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" LDFLAGS="-static" 
./configure --prefix=/usr/local/mysql --enable-assembler 
--localstatedir=/val/mysql 
--with-charset=euc_kr 
--with-extra-charsets=none 
--with-mysqld-user=mysql 
--sysconfdir=/etc 
--with-innodb 
--enable-thread-safe-client 
--with-mysqld-ldflags=-all-static 
--with-client-ldflags=-all-static


! pgcc란 Pentium용으로 최적화된 gcc다. 
http://goof.com/pcg/binaries-linux.html 에서 바이너리를 받을 수 있다.


pgcc는 레드햇의 경우 기본으로 포함된 패키지가 아니므로 설치해야만 한다.

처음 해보는 사람이라면 좀 헤멜 수도 있지만 그다지 어렵지는 않으니 필요한 부분을 잘 선택해서 사용하면 된다.

컴파일이 힘들다면 mysql에서 배포하는 바이너리를 이용하는 것도 좋은 방법이다.
mysql에서 배포하는 바이너리는 모두 pgcc로 컴파일되었으며 최적화된 configure를 사용했다고 한다.

물론 컴파일하는 것이 속도는 더 빠르다.

! pgcc를 이용한 컴파일은 mysql에만 한정된 것이 아니다. php, apache 등에도 pgcc를 이용하여 컴파일 하면 속도 향상의 효과를 볼 수 있다.

위의 방법의 컴파일만으로는 눈에띄는 속도의 향상을 느낄 수는 없었다..
물론 수치상으로는 빨라진 것은 분명하였다. 


b. my.cnf 의 설정 변경을 통한 튜닝

my.cnf 파일의 설정을 변경하므로서의 튜닝은 상황에 따라서는 매우 좋은 방법이라는 생각이 든다.
그런데 새로운 시스템에서는 어떻게 설정해야 할까 고민되는 부분이기도 하다.

개인적으로는 처음에는 mysql에서 기본으로 제공하는 my-huge.cnf, my-large.cnf, my-medium.cnf, my-small.cnf 을 사용하는 것을 추천한다.

물론 사용상황에 따른 변경은 해줘야 겠지만 말이다.

현재 mysql이 돌아가고 있다는 것을 가정하에 설명을 해보겠다.

#mysqladmin variables

my.cnf에서 설정된 내용을 볼 수 있다.
사실 그다지 볼 필요성은 없다..

여기서 중요하게 설정을 해야하는 부분만 설명해보겠다.

+ key_buffer_size : 성능에 많은 영향을 주는 설정이다. 키버퍼는 인덱스블락에서 사용하는 버퍼의 크기이며 인덱스가 많은 테이블에서 insert, delete릐 작업이 많다면 증가해 주는 것이 좋다.
+ max_connections : 동시 접속자수이다. 적당량으로 사용하는 것이 좋다. 너무 과하면 좋지 않다.
+ table_cache : 모든 쓰레드에서 열 수 있는 테이블 숫자이다.
+ join_buffer_size : full-join에서 사용하는 버퍼의 크기아다. full-join을 많이 사용하는 경우 늘려주는 것이 좋다. (왠만하면 인덱스를 사용한 조인을 하는 것이 속도가 빠르다)
+ max_join_size : 최대 조인의 크기이다. 크기 값보다 큰 조인인 경우는 에러가 난다.
+ record_buffer : 순차적인 검색을 하는 쓰레드에 할당하는 버퍼 크기로 순차적인 검색을 많이 하는 경우 증가시키는 것이 좋다
+ sort_buffer : 정렬시 각 쓰레드에 할당하는 버퍼크기. order by, group by를 빠르게 하려면 증가시키는 것이 좋다.
+ thread_cache_size : 이미 사용한 쿼리를 기억해 놓는 캐시의 할당 크기. 많이 할당 할 수록 좋으나 다른 설정을 위해 적당량으로 설정하는 것이 좋다. 같은 쿼리를 반복적으로 많이 하는 경우 크게 하는 것이 좋다.
+ tmp_table_size : 메모리 기반의 임시테이블을 디스크 기반의 임시테이블로 변환할 때의 크기. 복작한 쿼리를 실행할 경우 변환되는 경우가 많으며 여유있게 설정하는 것이 좋다. 단 디스크 용량을 생각해서..
+ wait_timeout : 연결을 끊기전 대기하는 시간


물론 이러한 부분들은 언제든지 유동성이 있게 설정하는 것이 중요하다.
처음 예측했던 것과는 다르게 mysql을 사용할 수 있으므로 지속적으로 모니터링하여 설정값을 변경해주어야 한다.

#mysqladmin extended-status

이 명령어로 mysql의 사용량을 알수가 있다.

이렇게 알아낸 사용량으로 my.cnf를 변경하여야 하며 주기적으로 확인하여 설정 값에 문제가 있는지 확인하는 것이 좋다.

역시 중요한 부분들만 살펴 보겠다.

+ Aborted_clients : 클라이언트에서 연결이 적절하게 닫지 못해서 죽어서 취소된 연결 횟수이다. 이 값이 많다면 네트워크 연결에 문제가 있을 가능성이 있다. 네트웍을 확인해 보는 것이 좋으나 경우에 따라서 프로그래밍시 연결을 적절하게 끊어주지 않아 많이 발생하는 경우도 있으므로 크게 신경 쓸 필요는 없다.
+ Aborted_connects : 연결을 시도해서 실패한 횟수로 최대 동시접속자 수나 네트웍을 확인해보아야 한다.
+ Connections : 연결을 시도한 횟수로 사용령을 알 수 있다.
+ Key_reads : 디스크에서 물리적으로 키 블락을 읽어들인 횟수로 이 값이 크면 key_buffer_size이 너무 작게 설정되어 있는 경우가 대부분이며 이 값이 크면 성능에 큰 문제가 될 수 있으므로 key_buffer_size를 크게 설정해야 하며 시스템의 성능이 늘릴 수 없을 경우에는 시스템을 업그레이드 하는 것이 좋다. key_buffer_size이 시스템의 성능에 비해 너무 크게 잡을 경우 계속적인 페이징을 하게되어 더 느려질 수 있으므로 잘 고려해야 한다.
+ Key_reads, Key_read_request : Key_reads/Key_read_request로 계산하면 캐시 히트률을 알 수 있다. 0.01보다는 작아야 하며 무조건 작을 수록 좋다. 0.01보다 클 경우 key_buffer_size를 조정한다.
+ Max_used_connections : 최대 동시 접속자수이며 이 값을 보고 max_connections의 값을 조정한다.
+ Opened_tables : 열었던 테이블 수로 이 값이 너무 클 경우 table_cache의 값이 작은 경우일 수 있으므로 table_cache의 값을 늘려 주어야 한다.
+ Select_full_join : 인덱스를 사용하지 않은 조인으로 최대한 0에 가깝게 해주는 것이 좋으며 값이 너무 클 경우 테이블의 인덱스를 재설정해주거나 쿼리문은 수정해야 한다.
+ Questions : 서버로 보낸 질의 횟수로 이 값으로 앞으로의 사용량을 예측해보아 앞으로의 업그레으드의 계획을 세우는 것이 좋다. Questions와 Uptime을 이용하여 초당 질의 수를 알아볼 수 있다.
+ Table_locks_waited : 테이블 락을 위해 대기한 시간으로 최대한 작아야 한다. 설정 값만으로 줄일 수는 없으며 너무 클 경우 데이타베이스의 설계나 쿼리문에 문제가 있을 수 있으며 속도저하의 원인이 대부분 여기서 찾을 수 있다. 이부분은 뒤에 따로 다루어 보겠다.


my.cnf의 설정은 메모리와의 연관이 많다. 충분한 메모리가 있을 경우 다양한 설정을 할 수 있다.
변수는 key_buffer, table_cache, sort_buffer, record_buffer 의 값이 성능에 가장 큰 영향을 주나 무조건 크다고 성능이 좋아지는 것은 아니다.
시스템에 맞게 설정하는 것이 중요하다.

[출처] 아낌없이 주는 사랑 | 마게님 (http://comager.blog.me/60040577018)

반응형

'리눅스 > MySQL' 카테고리의 다른 글

MySQL과 SQLite 날짜 함수 비교  (0) 2015.01.16
Mysql 효과적으로 사용하기 [2]  (0) 2015.01.16
MD5, SHA-1, MySQL Pass 서로간의 변경  (0) 2015.01.16
MySQL 튜닝 query cache 설정  (0) 2015.01.16
mysql 다양한 기초 문법  (0) 2015.01.16

댓글()

MD5, SHA-1, MySQL Pass 서로간의 변경

리눅스/MySQL|2015. 1. 16. 11:18
반응형

MySQL 의 패스워드로 잠시 고민... 

대부분의 설치형 보드에서 MySQL 의 PASSWORD() 함수를 써서 사용자의 패스워드를 저장한다. 
문제는 접속 어플리케이션에서 날 패스워드를 날려 서버에서 비교하는 것은 말도 안된다는 것. 
쌍방간에 인코딩을 적절히 하려면 먼저 MySQL이 패스워드를 저장하는지 알아야 할 것 아닌가... 

일단 mysql 에서 패스워드가 어케 동작하는지 보자구. 

mysql -u root -p 

mysql> select password('mypass'); 
+-------------------------------------------+ 
| password('mypass') | 
+-------------------------------------------+ 
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 | 
+-------------------------------------------+ 
1 row in set (0.00 sec) 


40글자. 160비트다. 


대충 인터넷을 뒤져보자. 

MySQL 사이트. 
http://dev.mysql.co...assword-hashing.html
 

여기에 달린 리플이 재미난다. 

function mysql_41_password($in) 

$p=sha1($in,true); 
$p=sha1($p); 
return "*".strtoupper($p); 


오호~~ 단순히 SHA1을 두번 거친 놈이네. 


진짜 그런지 테스트. (PHP) 


<?php 
$string = 'mypass'; 
printf("Original string: %sn", $string); 
printf("MD5 hash: %sn", md5($string)); 
printf("SHA-1 hash: %sn", sha1($string)); 
printf("MySQL Pass: %sn", sha1(sha1($string, true))); 
?> 

결과는 

Original string: mypass 
MD5 hash: a029d0df84eb5549c641e04a9ef389e5 
SHA-1 hash: e727d1464ae12436e899a726da5b2f11d8381b26 
MySQL Pass: 6c8989366eaf75bb670ad8ea7a7fc1176a95cef4 

대문자로 바꾸고 앞에 *만 붙이면 MySQL 의 패스워드 인코딩과 동일하다. 

[출처] http://www.gpgstudy.com/forum/viewtopic.php?p=125137&sid=cf619e282c948f016dbbbdf24d54ee32

반응형

댓글()

MySQL 튜닝 query cache 설정

리눅스/MySQL|2015. 1. 16. 11:17
반응형

query cache 설정을 하지 않았을때와 했을때는 엄청난 차이가 난다.  

본인이 직접 13만건데이터를 테스트 해본결과 cpu부하율은 80% 에서 0.2% 떨어졌고 검색 속도시간은 2.12초에서 0.00초로 단축됐다..  

쿼리 내용은  
select count(*) from 테이블명  

이런퀄리를 계속 적으로 반복 됐지만 캐싱이 되지 않아 버벅 되는 모습을 보였다..  

더욱이 innodb를 사용한다면 다음셋팅을 반드시 해주어야 한다 isam 방식에서는 별다른 차이를 못느꼈지만 innodb방식의 경우는 이 튜닝을 해주지 않고서는 5만건 이상되는 테이블을 서비스하기가 부담이 된다.  

#####----- query cache setting -----#####  
set-variable = query_cache_limit=1M  
set-variable = query_cache_size=2M  
set-variable = query_cache_type=1  

#####----- innodb setting -----#####  
# 주석을 제거 한후 셋팅  
innodb_data_home_dir = /usr/local/mysql/data  
innodb_data_file_path = ibdata1:1000M:autoextend  
innodb_buffer_pool_size = 16M  


반응형

댓글()

mysql 다양한 기초 문법

리눅스/MySQL|2015. 1. 16. 11:17
반응형

● 함수 : 복잡한 명령을 간단히 처리하기 위해서 만들어준 기능.

1. 단일함수 - 숫자함수, 날짜함수,문자열함수,논리함수 등
-> 하나의 데이타를 입력받아 처리하는 함수

 

2. 그룹함수 - 여러개의 데이타를 입력받아 처리하는 함수
 : count(), max(), min(), sum(), avg()

-------------------------------------------------------------------------------------

 

※ 단일함수 이용예제

ex) 대문자를 소문자로 만들어 주는 함수 : lcase, lower
mysql> select lower(pname) from person;

 

ex) 소문자를 대문자로 만들어 주는 함수 : ucase, upper
mysql> select upper(pname) from person;

 

ex) 사원의 이름을 출력하되 2번째 문자부터 4번째 문자까지만 출력
mysql> select substring(pname,2,3) from person;

 

ex) 사원의 이름을 출력하되, 첫번째 문자 대문자로 출력
mysql> select upper(substring(pname,1,1)) from person ;

 

ex) 사원의 이름을 출력하되, 첫번째 문자를 대문자로, 나머지는 소문자로 출력
mysql> select concat(upper(substring(pname,1,1)),lower(substring(pname,2,10))) from person ;

 

ex)사원의 이름과 이름 철자의 갯수를 출력
mysql> select pname,length(pname) from person;

 

ex) 사원의 이름 중 앞의 3문자만 출력
mysql> select pname,left(pname,3) from person;

 

ex) 123.45를 소숫점 1번째 자리에서 반올림하여 출력
mysql> select round(123.45,1) ;

 

ex) 123.45를 소숫점을 버리고 출력
mysql> select floor(123.45);

 

ex) 현재 날짜를 출력
mysql> select curdate();

 

ex) 사원의 사번, 이름, 급여와 급여가 3500 이상이면 good으로 3500미만이면 poor로 출력되도록 검색
mysql> select pno,pname,pay if(pay>=3500,'good','poor') result from person;
php에서 if문을 이용해서 사용한다.

ex)123456를 암호화하여 출력
mysql> select password('123456');


※ 그룹함수 이용예제
- 그룹함수를 사용할 경우 그룹함수만을 출력테이타로 사용한다.
- 그룹함수는 null를 데이타로 취급하지 않는다.

ex) person에 저장된 데이타의 갯수를 출력
mysql> select pno, count(pno) from person; =>사용불가(그룹함수만을 출력데이타로 사용해야 하기 때문)
mysql> select count(pno) from person; => 10 출력
mysql> select count(manager) from person; => 9 (데이타 1개가 null이기 때문)
mysql> select count(*) from person; => 갯수 파악할 경우 사용

 

ex) 사원의 급여 중 가장 적은 급여 출력
mysql> select min(pay) from person;

 

ex) 입사일이 최근인 사원의 입사일 출력
mysql> select max(startdate) from person;

 

ex) 사원 급여 합계를 출력
mysql> select sum(pay) from person;

 

ex) 사원 급여 평균을 출력
mysql> select avg(pay) from person;

 

ex) 10번 부서에 근무하는 사원들의 평균 급여를 출력
mysql> select avg(pay) from person where dno=10;

 

ex) 사원의 급여 + 보너스의 평균을 출력
mysql> select avg(pay+bonus) from person; => bonus에 null값이 있으므로 잘못된 값이 출력됨.
mysql> select avg(pay+ifnull(bonus,0)) from person;

- group by  : 그룹함수를 사용한 경우 select에서 사용하는 문장
전체데이타를 하나의 그룹으로 보는 것이 아니라 그룹을 세분화한다.

형식)
select 그룹함수(필드명) from 테이블명 where 조건문 group by 필드명;
=> group by의 필드값이 값을 것을 하나의 그룹으로 인식한다.
=> group by의 필드는 select에서 출력이 가능하다.
=> 출력데이타를 여러개 둘 수 있다.

 

ex) 부서별 인원을 파악하여 출력
mysql> select count(*) from person group by dno;

 

ex) 부서별 인원을 파악하여 부서와 인원 출력
mysql> select dno,count(*) from person group by dno;

 

ex) 업무별 급여 평균을 구하여 업무 및 평균급여 출력
mysql> select job,avg(pay) from person group by job;

- having : 그룹함수에 의한 조건문을 제시하기 위해 사용

형식)
select 그룹함수(필드명) from 테이블명 where 조건문 group by 필드명 having 그룹함수조건문;

 

ex) 부서별 급여 평균을 구하여 부서 및 평균급여를 출력하되, 평균급여가 3000이상인 부서만 검색하여 출력.
mysql> select dno,avg(pay) from person group by dno having avg(pay)>=3000;

- order by : 데이타를 정렬(sort)하여 출력해주는 문장
형식)
select 출력데이타 from 테이블명 where 조건문 group by 필드명 having 그룹함수조건문 order by 필드명 asc(또는 desc), 필드명 asc (또는 desc),...;

※ 정렬순서
asc : 오름차순. 일반적으로 생략하여 사용
desc : 내림차순 정렬

 

ex) person에서 사번,이름,급여를 출력하되 급여순으로 오름차순으로 정렬하여 출력
mysql> select pno,pname,pay from person order by pay asc;
mysql> select pno,pname,pay from person order by pay; (asc 생략가능)

 

ex) person에서 사번,이름,급여를 출력하되 입사일순로 내림차순으로 정렬하여 출력
mysql> select pno,pname,pay from person order by startdate desc;

 

ex) person에서 사번,이름,급여,부서번호를 출력하되 부서순로 오름차순으로 정렬하고 부서가 같은 경우 급여순으로 내림차순 정렬하여 출력
mysql> select pno,pname,pay,dno from person order by dno,pay desc;
mysql> select pno,pname,pay,dno from person order by dno asc,pay desc;

 

ex) person에서 사번,이름,연봉을 출력하되 연봉순으로 내림차순정렬. 단 연봉은 급여*12 + 보너스로 하고 필드명은 yearpay로 한다.
mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person order by yearpay desc;

 

ex) person에서 사번,이름,연봉을 출력하되 업무가 salesman인 사원을 연봉순으로 내림차순정렬. 단 연봉은 급여*12 + 보너스로 하고 필드명은 yearpay로 한다.
mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person where job='salesman' order by yearpay desc;

mysql> select pno,pname,pay*12+ifnull(bonus,0) yearpay from person where job='salesman' order by 3 desc;

 

3 : 출력되는 3번째 필드를 정렬의 기준으로 하라는 의미.

 

ex) person에서 업무별 평균급여를 구하여 업무,평균급여를 출력하되 평균급여가 4000이상인 업무만 출력. 단, 평균급여의 내림차순 정렬.
mysql> select job,avg(pay) avgpay from person group by job having avg(pay)>=4000 order by avg(pay) desc;
mysql> select job,avg(pay) avgpay from person group by job having avgpay>=4000 order by avgpay desc;

 

ex) person에서 업무가 president를 제외한 업무별 평균급여를 구하여 업무,평균급여를 출력하되 평균급여가 4000이상인 업무만 출력. 단, 평균급여의 내림차순 정렬.
mysql> select job,avg(pay) avgpay from person where job!='president' group by job having avgpay>=4000 order by avgpay desc;

- limit : 출력 갯수를 제어하여 출력
형식)
select 출력데이타 from 테이블명 where 조건문 
  group by 필드명 having 그룹함수조건문 
  order by 필드명 asc(또는 desc), 필드명 asc (또는 desc),...
  limit 시작위치,갯수;

※ 시작위치 생략시 처음으로 인식. 행의 번호는 0번 부터 시작한다는 것을 유의할 것.

 

ex) person에서  사번,이름,급여를 출력하되 처음부터 5명만 출력
mysql> select pno,pname,pay from person limit 5;

 

ex) person에서  사번,이름,급여를 출력하되 두번째부터 5명만 출력
mysql> select pno,pname,pay from person limit 1,5;

 

[출처] 인간승리 | 인간승리 (http://bigl2929.textcube.com/31)

반응형

댓글()

[Warning] /usr/local/mysql/libexec/mysqld: Forcing close of thread 15 user:

리눅스/MySQL|2015. 1. 16. 11:16
반응형

101224 11:40:07 [Warning] /usr/local/mysql/libexec/mysqld: Forcing close of thread 15 user:

 

mysql 이 스스로 멈추는 경우 mysql 에러로그를 보면 위와같은 메세지가 많이 출력되어있는

경우가 있습니다.

이럴 경우에는 간단히 my.cnf 파일을 수정하여 해결을 할 수 있습니다.

 

vi /etc/my.cnf

[mysqld]

skip-name-resolve    // 주석 제거를 하거나 항목이 없는경우 추가를 해줍니다.

 

저장 후 mysql 을 재시작 하면 mysql 이 스스로 다운되는 현해당 문제가 해결 됩니다.

 

※ 참고 

skip-name-resolve

> DB에 연결된 IP에 대해 resolve 하지않고 그냥 처리합니다.

반응형

댓글()

MYSQL 테이블 컬럼 수정 (추가, 수정 ,삭제)

리눅스/MySQL|2015. 1. 16. 11:15
반응형

sysdocu 라는 테이블에 member 라는 컬럼을 추가, 수정, 삭제하는 예제입니다.

 

1. 추가

alter table 테이블명 add 컬럼명 옵션;

예1) alter table sysdocu add member varchar(250) not null;

예2) alter table sysdocu add member 

varchar(250) not null after group;

    // group 컬럼 다음에 입력 (맨앞은 first)

 

2. 수정

alter table 테이블명 modify 컬럼명 옵션;

예) alter table sysdocu modify member varchar(200) not null;

예) alter table sysdocu change user member varchar(200) not null;    // user : 구 컬럼명, member : 신 컬럼명

예) alter table sysdocu change member member varchar(200) after name;    // 컬럼 위치 변경. 기존 컬럼명 member 이름 두번쓰는것 주의

 

3. 삭제

alter table 테이블명 drop 컬럼명;

예) alter table sysdocu drop member;

 

※ 참고

1. 쿼리 옵션

auto_increment    // 자동으로 증가되는 값이 생성됩니다.

not null                // 빈 데이타가 들어갈 수 없습니다.

default 내용        // 들어갈 데이타가 없을경우 기본값을 입력합니다.

 

2. 테이블 구조 보기

mysql> desc 테이블명

반응형

댓글()

mysql euckr과 utf8 같이 사용하기

리눅스/MySQL|2015. 1. 16. 11:15
반응형

현재 제 서버에는 euckr로 운영중인 사이트만 있어 mysql 설정에서 디폴트 캐릭터셋을 euckr로 해둔 상태입니다. 기존 운영중인 사이트를 굳이 utf8로 변경할 필요가 없기 때문에.... 근데 이번에 신규로 개발하는 사이트부터는 utf8로 개발할 예정이라 부득이 하게 euckr과 utf8 을 동시에 사용하게 되었습니다. 여기서부터 삽질이 시작되었는데....

핵심적인 부분이 기존 운영중인 사이트에는 아무런 영향을 주지 않고 신규 사이트를 utf8로 운영할 수 있도록 할려고 합니다.
일단 적용에 성공했고 아래 자료는 참고자료를 바탕으로 100% 테스트해 본 결과입니다.

 

일단 디폴트 캐릭터셋을 utf8로 변경합니다.

my.cnf 변경

-------------------------------

[client]
default-character-set=utf8

 

[mysqld]
default-character-set=utf8

 

[mysql]
default-character-set=utf8

-------------------------------

 

이렇게 변경합니다. (euckr -> utf8로) 
mysql restart 합니다.

변경후 제대로 되었는지 확인합니다.

mysql> show variables like 'c%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |
| character_set_connection | utf8                                   |
| character_set_database   | utf8                                   |
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |
| character_set_server     | utf8                                   |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci                        |
| collation_database       | utf8_general_ci                        |
| collation_server         | utf8_general_ci                        |
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+
14 rows in set (0.00 sec)

 

위와 같이 변경되었으면 정상적으로 변경된겁니다.

 

위와 같이 디폴트 캐릭터셋을 변경하더라도 기존 euckr사이트에는 아무런 영향이 없습니다.
(프로그램 변경이나 DB수정 작업은 필요치 않습니다)

 

여기에 utf8 사이트를 추가해 봅니다.
디폴터 캐릭터셋을 utf8로 했기 때문에 DB를 생성하시면 utf8로 생성이 됩니다.

 

그런후 일단 테스트로 그누보드 utf8 버전을 설치해 봅니다.
그냥 설치하시면 DB 한글이 깨집니다. 따라서 설치전 파일 2개를 수정하셔야 됩니다.

 

[ 그누보드 ]
DB를 euckr 과 uft8 을 같이 사용하는 경우 utf8 프로그램에 아래 부분을 추가해주어야 됨

common.php
$connect_db = sql_connect($mysql_host, $mysql_user, $mysql_password);
$select_db = sql_select_db($mysql_db, $connect_db);
mysql_query("set names utf8");    //utf8 설정 추가

 

install_db.php
$select_db = @mysql_select_db($mysql_db, $dblink);
mysql_query("set names utf8");    // utf8 설정 추가

 

이렇게 수정후 설치하시면 100% 모든 데이타가 utf8로 처리되고 phpmyamin 등에서도 euckr 과 utf8 모두 정상적으로 한글이 보입니다.

 

참고로 위에 부분이 그누보드 utf8 버전에는 기본적으로 포함되었으면 좋겠습니다^^ (영자님 참고해 주세요)

 

위에 방법말고 utf8 전용 서버에서는 프로그램 수정없이 my.cnf 를 아래와 같이 설정하시면 됩니다.

[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci

 

이렇게 설정하시면 프로그램에 mysql_query("set names utf8"); 를 추가하지 않아도 기본적으로 utf8로 모든 데이타가 처리됩니다.


단 euckr과 utf8 같이 사용하는 서버에서는 위와 같이 설정하시면 euckr 사이트가 정상적으로 동작되지 않습니다. 참고하시길...

 

한글문제로 고민하는 분들께 조금이나마 도움이 되었으면 좋겠습니다.

 

---------------------------------------------------

 

[댓글]

참고로 다양한 웹호스팅 환경을 고려한다면 프로그램쪽에

mysql_query("set names utf8"); 이 부분을 추가하는게 더 좋을 것 같다는 생각입니다.

euckr 의 경우는 mysql_query("set names euckr"); 추가하면 더 확실하겠죠^^ 

 

[출처] SIR | 하이하바 (http://sir.co.kr/bbs/board.php?bo_table=pg_mysql&wr_id=215)

 

 

★ 요약

DB 는 utf8 로 설정하고

my.cnf 의 [client] [mysqld] [mysql] 항목에 각각 아래 한줄 추가

default-character-set=utf8

 

확실히 하기 위해 웹소스에서 각각의 DB 캐릿터셋에 맞게

mysql_query("set names utf8"); 또는

mysql_query("set names euckr"); 를 추가하면 됩니다.

반응형

댓글()

phpMyAdmin 캐릭터셋 변경

리눅스/MySQL|2015. 1. 16. 11:15
반응형

config.inc.php 파일에 아래 내용을 추가합니다.

 

$cfg['Lang'] = 'ko-euc-kr';
$cfg['Export']['charset'] = 'euc-kr';
$cfg['AvailableCharsets'] = 'euc-kr';
$cfg['DefaultConnectionCollation'] = 'euckr_korean_ci';

 

또는 utf8 의 경우

 

$cfg['Lang'] = 'ko-utf-8';
$cfg['Export']['charset'] = 'utf8';
$cfg['AvailableCharsets'] = 'utf8';
$cfg['DefaultConnectionCollation'] = 'utf8_general_ci';
 

또한 phpmyadmin 로그인시 풀다운메뉴에서 캐릭터셋이 예전 그대로 셋팅되어있다면 수동으로 바꾸어줍니다.

다음 로그인부터는 정상 출력됩니다.

반응형

댓글()

Starting MySQLCouldn't find MySQL manager or server

리눅스/MySQL|2015. 1. 16. 11:14
반응형

Solution 
Step 1.)

Rem out the line in /etc/my.conf that was setting basedir to /var/lib. As seen below:

user=mysql
#basedir=/var/lib

Step 2.)

Create the directory "/var/run/mysqld" if it does not exist. Then chown that directory to mysql.mysql as below...

mkdir /var/run/mysqld
chown mysql.mysql /var/run/mysqld

Step 3.)

Start the service..

service mysql start

 

[출처] http://javasolution.blogspot.com/2007/04/mysql-couldnt-find-mysql-server-or.html

 

※ basedir 이 /etc/init.d/mysqld 구동파일과 /etc/my.cnf 에 있을 수 있으니 둘 다 확인해보아야 합니다.

반응형

댓글()