달력

52024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
반응형
http://dev.mysql.com/doc/refman/5.5/en/numeric-types.html
Type     Storage    Minimum Value        Maximum Value
         (Bytes)    (Signed/Unsigned)   (Signed/Unsigned)
TINYINT     1           -128                    127
                          0                     255
SMALLINT    2          -32768                   32767
                          0                     65535
MEDIUMINT   3          -8388608                8388607
                          0                   16777215
INT         4         -2147483648            2147483647
                          0                  4294967295
BIGINT      8      -9223372036854775808  9223372036854775807
                          0             18446744073709551615


반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

http://sqlmvp.kr/220365937569

MySQL/MariaDB Memory 관련 설정 변수


 


  • Version : Mariadb 5.5.4.2-WinX64


 


MySQL/MariaDB 서버에서는 메모리 관련된 설정이 중요하다. MySQL에서 스토리지 엔진별로 주요 메모리 공간이 공유되지 않기 때문에 사용하는 스토리지 엔진에 맞게 메모리 사용을 제한하는 것이 중요하다.


 


여기에서는 중요한 변수 몇 가지만 소개한다. 자세한 내용은 공식 매뉴얼을 참고한다.


 


설정 가능한 변수 목록은 show variables 명령을 사용하여 확인 할 수 있다.


show variables;


 



 


  • innodb_buffer_pool_size : 디스크에서 데이터를 메모리에 캐싱함과 동시에 데이터의 변경을 버퍼링하는 역할을 수행한다. 일반적으로 전체 메모리의 50% ~ 80%까지 설정하며 낮은 값부터 조금씩 크기를 올려가며 적절한 값을 찾는 것이 것이 좋다. 정적 변수이기 때문에 설정 적용을 위해서는 MySQL 재시작이 필요하다.

  • join_buffer_size : 조인이 발생할 때마다 사용되는 버퍼가 아니다. 적절한 조인 조건이 없어서 드리븐 테이블의 검색이 풀 테이블 스캔으로 유도되는 경우 사용 된다.  

  • key_buffer_size : MyISAM의 키 버퍼는 인덱스를 메모리에 저장하는 버퍼의 크기이다. 인덱스만 캐시하기 때문에 InnoDB의 버퍼 풀만큼 할당해서는 안된다. 일반 적으로 전체 메모리의 30~50% 할당하는 것이 좋다.

  • read_buffer_size : MySQL 매뉴얼에서는 풀 테이블 스캔이 발생하는 경우 사용하는 버퍼라고 설명하고 있지만 많은 스토리지 엔진에서 다른 용도로 사용하기도 하기 때문에 명확히 정의하기 어렵다.

  • read_rnd_buffer_size : 인덱스를 사용해 정렬할 수 없을 경우 정렬된 데이터를 메모리에 저장하여 디스크를 다시 한번 읽지 않도록 버퍼링한다. 이때 버퍼의 크기를 결정하는 역할을 한다.

  • sort_buffer_size : 인덱스를 사용할 수 없는 정렬에 메모리 공간을 얼마나 할당할지 결정하는 설정값이다. 이 크기가 너무 작으면 디스크 사용확률이 높아지고 높아지면 클라이언트 스레드가 사용하는 메모리의 양이 커져 메모리 낭비가 심해진다. 이 메모리 공간이 크다고 해서 무조건 정렬이 빨리 끝나는 것은 아니다.

  • tmp_table_size : 메모리에 생성되는 임시 테이블의 최대 크기를 설정한다.

  • Query_cache_size, query_cache_limit : 쿼리 캐시에 관련된 캐시의 크기를 설정한다. 쿼리 캐시는 무조건 크게 설정하는 것이 항상 좋은 것은 아니다.

  • key_cache_block_size – block 크기이며 기본값 1024(단위 byte) 이다.

  • myisam_sort_buffer_size : Repair table, Alter table, CREATE INDEX에 사용되는 버퍼 메모리 크기이다. 최대크기는 4GB이다.


 


[참고자료]


RealMySQL (위키북스)

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

MySQL/MariaDB 아키텍처 메모리 할당 및 사용 구조

 

  • Version : Mariadb 5.5.4.2-WinX64

 

MySQL/MariaDB 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역은 MySQL 서버가 시작되면서 무조건 운영체제로부터 할당된다. 글로벌 메모리 영역과 로컬 메모리 영역의 차이는 MySQL서버 내에 존재하는 스레드가 공유해서 사용하는 공간인지 아닌지에 따라 구분된다.

 


  • MySQL 서버의 메모리사용량 =  (글로벌 메모리) + (각 클라이언트 스레드 사용 메모리)

 

[글로벌 메모리 영역]

일반적으로 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간이 할당된다. 필요에 따라서 2개 이상의 메모리 공간을 할당 받을 수도 있다. 생성된 글로벌 메모리 영역이 N개라도 모든 스레드에 의해 공유된다.

 

 

[로컬 메모리 영역]

세션 메모리 영역이라고 표현하며 MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역이다. 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라이언트 메모리 영역 또는 세션 메모리 영역이라고도 한다.

로컬 메모리는 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용되지 않는다. 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않을때는 MySQL이 메모리 공간을 할당하지 않을 수도 있다(대표적으로 소트 버퍼, 조인 버퍼 등). 로컬 메모리 공간은 커넥션이 열려있는 동안 계속 할당된 상태로 남아 있는 공간도 있고(커넥션 버퍼, 결과 버퍼), 쿼리를 실행하는 순간에만 할당했다가 다시 해제하는 공간(소트 버퍼나 조인 버퍼)도 있다.

 

[참고자료]

RealMySQL (위키북스)

 

  • Version : Mariadb 5.5.4.2-WinX64

 

MySQL/MariaDB 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분할 수 있다. 글로벌 메모리 영역은 MySQL 서버가 시작되면서 무조건 운영체제로부터 할당된다. 글로벌 메모리 영역과 로컬 메모리 영역의 차이는 MySQL서버 내에 존재하는 스레드가 공유해서 사용하는 공간인지 아닌지에 따라 구분된다.

 


  • MySQL 서버의 메모리사용량 =  (글로벌 메모리) + (각 클라이언트 스레드 사용 메모리)

 

[글로벌 메모리 영역]

일반적으로 클라이언트 스레드의 수와 무관하게 하나의 메모리 공간이 할당된다. 필요에 따라서 2개 이상의 메모리 공간을 할당 받을 수도 있다. 생성된 글로벌 메모리 영역이 N개라도 모든 스레드에 의해 공유된다.

 

 

[로컬 메모리 영역]

세션 메모리 영역이라고 표현하며 MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리 영역이다. 클라이언트 스레드가 사용하는 메모리 공간이라고 해서 클라이언트 메모리 영역 또는 세션 메모리 영역이라고도 한다.

로컬 메모리는 각 클라이언트 스레드별로 독립적으로 할당되며 절대 공유되어 사용되지 않는다. 각 쿼리의 용도별로 필요할 때만 공간이 할당되고 필요하지 않을때는 MySQL이 메모리 공간을 할당하지 않을 수도 있다(대표적으로 소트 버퍼, 조인 버퍼 등). 로컬 메모리 공간은 커넥션이 열려있는 동안 계속 할당된 상태로 남아 있는 공간도 있고(커넥션 버퍼, 결과 버퍼), 쿼리를 실행하는 순간에만 할당했다가 다시 해제하는 공간(소트 버퍼나 조인 버퍼)도 있다.

 

[참고자료]

RealMySQL (위키북스)

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

- ASCII(str) : 해당 인저의 아스키 값을 반환한다. 문자열이 한글자 이상일 경우는 첫번째 문자에 해당하는 아스키 값을 반환한다.빈 문자열에 대해서는 0, NULL 에 대해서는 NULL을 반환한다.

- : selectASCII('2');

 

- CONCAT(X,Y,...) : 해당 인자들을 연결한 문자열을반환한다. 인자중 하나가 NULL 일 경우는 NULL 을 반환한다.

- : selectCONCAT('My', 'S', 'QL');

 

- LENGTH(str) : 문자열의 길이를 반환한다.

- : selectLENGTH('text');

 

- OCTET_LENGTH(str) : LENGTH(str) 와 동일하다.

 

- CHARACTER_LENGTH(str) : LENGTH(str) 와동일하다.

 

- LOCATE(substr,str) : 첫번째 인자에서 두번째 인자가있는 위치를 반환한다. 없을경우 0 을 반환한다.

- : selectLOCATE('bar', 'foobarbar');

 

- POSITION(substr IN str) :LOCATE(substr,str) 와 동일하다.

 

- LOCATE(substr,str,pos) : 두번째 인자에서 세번째인자의 자리수부터 검색을 하여 첫번째 인자가 발견되는 위치를 반환한다.

- : selectLOCATE('bar', 'foobarbar',5);

 

- INSTR(str,substr) : LOCATE(substr,str) 와동일한 기능을 하며, 차이점은 첫번째 인자와 두번째 인자가 바뀐것 뿐이다.

- : selectINSTR('foobarbar', 'bar');

 

- LPAD(str,len,padstr) : 첫번째 인자를 두번째인자만큼의 길이로 변환한 문자열을 반환한다. 모자란 공간은 왼쪽에 세번째 인자로 채운다.

- : selectLPAD('hi',4,' ');

 

- RPAD(str,len,padstr) : LPAD 와 반대로 오른쪽에빈공간을 채운다.

- : selectRPAD('hi',5,'?');

 

- LEFT(str,len) : 첫번째 문자열에서 두번째 길이만큼만을반환한다.

- : selectLEFT('foobarbar', 5);

 

- RIGHT(str,len) : LEFT(str,len) 와 동일하다. 차이점은 해당 길이만큼 오른쪽에서부터 반환한다.

- : selectRIGHT('foobarbar', 4);

select SUBSTRING('foobarbar' FROM 4);

 

- SUBSTRING(str,pos,len) : 첫번째 인자의 문자열에서두번째 인자의 위치부터 세번째 인자의 길이만큼 반환한다.

- : selectSUBSTRING('Quadratically',5,6);

 

- SUBSTRING(str FROM pos FOR len) :SUBSTRING(str,pos,len) 과 동일하다.

 

- MID(str,pos,len) : SUBSTRING(str,pos,len)과 동일하다.

 

- SUBSTRING(str,pos) : 첫번째 인자의 문자열에서두번째 인자로부터의 모든 문자열을 반환한다.

- : selectSUBSTRING('Quadratically',5);

 

- SUBSTRING(str FROM pos) :SUBSTRING(str,pos) 와 동일하다.

 

- SUBSTRING_INDEX(str,delim,count) : 첫번째인자인 문자열을 두번째 문자로 구분하여 세번째 인자 수의 위치만큼 반환한다. 예를들어 select SUBSTRING_INDEX('www.mysql.com', '.', 2) 'www.mysql' 을 반환한다. 세번째 인자가 음수일경우는 반대로오른쪽에서부터 검색하여 결과를 반환한다.

- : selectSUBSTRING_INDEX('www.mysql.com', '.', -2);

 

- LTRIM(str) : 왼쪽에 있는 공백문자를 제거한 문자열을반환한다.

- : select LTRIM('barbar');

 

- RTRIM(str) : 오른쪽에 있는 공백문자를 제거한 문자열을반환한다.

- : selectRTRIM('barbar ');

 

- TRIM([[BOTH | LEADING | TRAILING][remstr] FROM] str)

- : select TRIM('bar ');

select TRIM(LEADING 'x' FROM 'xxxbarxxx');

select TRIM(BOTH 'x' FROM 'xxxbarxxx');

select TRIM(TRAILING 'xyz' FROM 'barxxyz');

 

- REPLACE(str,from_str,to_str) : 문자열은치환한다.

- : selectREPLACE('www.mysql.com', 'www', 'ftp');

 

- REVERSE(str) : 문자열을 뒤집는다. 예를들어, select REVERSE('abc') 'cba' 를 반환한다.

 

- LCASE(str) : 문자열을 소문자로 변환한다.

- : selectLCASE('QUADRATICALLY');

 

- LOWER(str) : LCASE(str) 와 동일하다.

 

- UCASE(str) : 문자열을 대문자로 변환한다.

- : selectUCASE('Hej');

 

- UPPER(str) : UCASE(str) 와 동일하다.

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

출처 http://cafe.naver.com/masterexcel/592

 

DROP FUNCTION IF EXISTS split_str;

DELIMITER $$

CREATE FUNCTION split_str(in_str text, d_char varchar(1), pos int)
RETURNS text
RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(in_str, d_char, pos), d_char, -1);
$$

DELIMITER ;

 

 


select 'Shin-Osaka, Osaka, Japan',  split_str('Shin-Osaka, Osaka, Japan',',',1)

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

-- 테이블에 자동증가 PK컬럼 만들고 추가된 컬럼 맨 앞으로 이동하기
ALTER TABLE tableName ADD columnName INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;


-- 테이블에 컬럼 만들기
ALTER TABLE tableName ADD columnName INT NOT NULL;


-- 테이블에 자동증가 PK컬럼 수정하고 맨 앞으로 이동하기
ALTER TABLE tableName MODIFY columnName INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;


-- 테이블에 컬럼 수정하기
ALTER TABLE tableName MODIFY columnName INT NOT NULL;


-- 테이블명 tableName1에서 tableName2로 변경
ALTER TABLE tableName1 RENAME tableName2;


-- 컬럼명 columnName1에서 columnName2로 변경

ALTER TABLE tableName CHANGE columnName1 columnName2  VARCHAR(10) NOT NULL;


-- 컬럼명 columnName1 위치를 columnName2 뒤로 컬럼순서 변경
ALTER TABLE tableName CHANGE COLUMN columnName1 columnName1 VARCHAR(1) NOT NULL DEFAULT 'N'  AFTER columnName2;


-- 컬럼 삭제
ALTER TABLE tableName DROP columnName;


-- 지정한 컬럼 뒤에 새로운 컬럼 추가
ALTER TABLE tableName ADD columnName VARCHAR(10) NOT NULL AFTER 지정컬럼;


-- 지정 컬럼 지우고 맨 앞에 컬럼 추가
ALTER TABLE tableName DROP 지정컬럼, ADD columnName VARCHAR(10) NOT NULL FIRST;


-- PRIMARY KEY 삭제
ALTER TABLE tableName DROP PRIMARY KEY;

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

참고 : http://seuis398.blog.me/220063603924  

MySQL에서 파티셔닝은 성능 문제로 권장되는 옵션은 아니다.

하지만, 로그 데이터와 같이 주기적으로 과거 데이터를 삭제해야 되는 경우라면 파티셔닝이 매우 편리하다.

신규 파티션 추가와 오래된 파티션 삭제를 수작업으로 하기는 번거로울테니, 간단하게 이 과정을 자동화 해 줄 프로시저를 만들어 봄~


[파티션 관리 요건]

- 어떠한 이유에서든지 프로시저가 동작하지 않은 경우라도 데이터 INSERT 실패가 발생하지 않도록 할 것

- 프로시저가 일정 기간 동작하지 않고 다시 재가동 되는 경우에, 프로시저가 주기적으로 동작했던 것과 동일한 파티션 구조를 생성할 것

- 파티션 삭제시 Table Lock으로 인한 영향을 최소화 할 것


[파티션 생성 프로시저]

CREATE PROCEDURE create_partition(p_dbname varchar(255), p_tbname varchar(255), p_future INT, p_interval INT)

SQL SECURITY INVOKER
BEGIN
   DECLARE x, max_pdesc, new_pdesc INT;
   DECLARE pname VARCHAR(64);
   DECLARE alter_cmd VARCHAR(1024);
 
  -- 현재 테이블의 파티션의 가장 마지막 파티션의 HIGH VALUE 값을 구함
   SELECT MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) INTO x FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION != 'MAXVALUE' ;

   -- 파티션 미리 생성할 기한까지 지정한 interval에 맞도록 파티션 추가
   -- 파티션 추가는 ADD PARTITION이 아닌 MAXVALUE 파티션의 REORGANIZE로 처리됨
   WHILE x <= p_future DO
      SELECT
         CONCAT('p', DATE_FORMAT(current_date() + interval MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) day, '%Y%m%d')),
         MAX(PARTITION_DESCRIPTION),
         MAX(PARTITION_DESCRIPTION) + p_interval
      INTO pname, max_pdesc, new_pdesc
      FROM information_schema.PARTITIONS
      WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE';
    
      IF max_pdesc < new_pdesc THEN
         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' REORGANIZE PARTITION pMAXVALUE INTO (',
                          'PARTITION ', pname, ' VALUES LESS THAN (', new_pdesc, '), PARTITION pMAXVALUE VALUES LESS THAN MAXVALUE)' );
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;     
         DEALLOCATE PREPARE alter_cmd;
      END IF;
      SET x = x + p_interval;
   END WHILE;
  
   -- 파티션 정보 출력 (옵션)
   SELECT current_date() + interval MAX(PARTITION_DESCRIPTION) - TO_DAYS(current_date()) - 1 day AS Last_Date,
          COUNT(*) AS Partitions_For_Future
   FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION != 'MAXVALUE' 
      AND PARTITION_DESCRIPTION > TO_DAYS(current_date()) + 1;
END 


[파티션 삭제 프로시저]

CREATE PROCEDURE delete_partition(p_dbname varchar(255), p_tbname varchar(255), p_del_date INT)
SQL SECURITY INVOKER
BEGIN
   DECLARE done INT;
   DECLARE pname VARCHAR(64);
   DECLARE alter_cmd VARCHAR(1024);
   DECLARE deleted_partition VARCHAR(1024);

  -- 삭제할 파티션 목록 취합
   DECLARE cur CURSOR FOR
      SELECT PARTITION_NAME FROM information_schema.PARTITIONS
      WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE'
        AND PARTITION_DESCRIPTION<=TO_DAYS(current_date()) - p_del_date ;
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
   SET done = 0;
 
   -- 삭제 대상 파티션 목록 확인 및 작업 완료 후 출력 (옵션)

   SELECT GROUP_CONCAT(PARTITION_NAME) INTO deleted_partition 

   FROM information_schema.PARTITIONS
   WHERE TABLE_SCHEMA = p_dbname AND TABLE_NAME = p_tbname AND PARTITION_DESCRIPTION!='MAXVALUE'
     AND PARTITION_DESCRIPTION<=TO_DAYS(current_date()) - p_del_date ;
   
   OPEN cur;  
   FETCH cur INTO pname;

   WHILE done = 0 DO

     -- MySQL 5.6 버전 이상인 경우 동일 스키마로 빈 테이블을 만들어서 PARTITION EXCHANGE 처리 후 DROP PARTITION

     -- 파티션 삭제 처리 시간 지연으로 인한 Table Lock 영향을 최소화하기 위함

      IF left(version(),3) >= '5.6' THEN
         -- make empty table for exchange
         SET @alter_sql := CONCAT('CREATE TABLE ', p_dbname, '._exchange_', p_tbname, ' LIKE ', p_dbname, '.' , p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '._exchange_', p_tbname, ' REMOVE PARTITIONING');
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         -- exchange
         SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' EXCHANGE PARTITION ', pname, ' WITH TABLE ', p_dbname, '._exchange_', p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;

         -- drop tmp table
         SET @alter_sql := CONCAT('DROP TABLE ', p_dbname, '._exchange_', p_tbname);
         PREPARE alter_cmd FROM @alter_sql;
         EXECUTE alter_cmd;
         DEALLOCATE PREPARE alter_cmd;
      END IF;

      -- 파티션 삭제
      SET @alter_sql := CONCAT('ALTER TABLE ', p_dbname, '.', p_tbname, ' DROP PARTITION ', pname);
      PREPARE alter_cmd FROM @alter_sql;
      EXECUTE alter_cmd;
      DEALLOCATE PREPARE alter_cmd;
      
      FETCH cur INTO pname;
   END WHILE;

   CLOSE cur;


   -- 삭제 처리한 파티션 목록 출력 (옵션)
   SELECT deleted_partition AS Deleted_Partitions ;
END 


[동작 예시]

1) mydb.daily_table 테이블에 대해서 금일 날짜 기준으로 30일이 경과한 파티션을 삭제

 mysql> call delete_partition('mydb', 'daily_table', 30);
 +--------------------+
 | Deleted_Partitions        |
 +--------------------+
 | p20140610,p20140611  |  --> 삭제된 파티션 목록 출력됨
 +--------------------+

2) mydb.daily_table 테이블에 대해서 금일 날짜 기준으로 7일 후까지 1일 간격으로 파티션을 생성

  mysql> call create_partition('mydb', 'daily_table', 7, 1);
 +-----------+------------------+
 | Last_Date    | Partitions_For_Future | 
 +-----------+------------------+
 | 2014-07-18 |                       7 |  --> 미리 생성되어 있는 파티션들의 개수와 수용 가능한 날짜 정보 출력
 +-----------+------------------+
 

[이벤트 스케줄러 적용]

- 이벤트 스케줄러 미활성 상태인 경우 활성화, 이벤트 스케줄러 미지원 버전인 경우에는 crontab 등록
 set global event_scheduler=on;  -- my.cnf에도 추가

- 이벤트 생성 (프로시저는 mysql db에 생성한 것으로 가정)
DELIMITER $
drop event if exists evt_partition_management $

CREATE DEFINER=`root`@`localhost` EVENT evt_partition_management
ON SCHEDULE EVERY '1' DAY STARTS '2014-07-12 01:00:00'    -- 스케쥴러 시작 시점은 반드시 현재 날짜 기준으로 미래 시점이어야 함
DO
BEGIN
  call mysql.delete_partition('mydb', 'daily_table', 30);  
  call mysql.delete_partition('mydb', 'weekly_table', 180);
  call mysql.create_partition('mydb', 'daily_table', 3, 1);
  call mysql.create_partition('mydb', 'weekly_table', 14, 7);
END $
DELIMITER ;

 

[유의사항]

- 파티셔닝 키 컬럼이 datetime이 아닌 timestamp라면 HIGH VALUE 비교하는 부분 수정 필요 (date 타입은 사용 가능)

- MySQL이 아닌 MariaDB를 사용하는 경우 PARTITION EXCHANGE 부분에서 DB 버전 체크하는 부분 수정 필요

- 적용 대상 테이블은 사전에 RANGE 방식의 파티셔닝 구성이 되어 있어야 하며, MAXVALUE 파티션(파티션명 : pMAXVALUE)이 만들어져 있어야 함 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|
반응형

참고 : http://blog.naver.com/jjang2guna/100128881776

USE database_name;        ← 사용할 데이터 베이스 선택 :

 

① 검색

   SELECT * FROM table_name WHERE abc_column='a' ;

② 수정

   UPDATE  tabel_name  SET  a_column='a'  WHERE b_column='b' ;

③ 삽입

   INSERT INTO  table_name (a_column, b_column) VALUES ('a', 'b') ;

④ 삭제

   DELETE FROM  table_name  WHERE d_column='del' ;

   ※ TRUNCATE table_name;   ← 전체 레코드 삭제 ( DELETE FROM table_name 보다 빠름 )

 

 

 

MySQL 명령어 완전 쉽죠~

 

 

자~ 여기부터는 MySQL 명령어 기초를 살짝 넘어가 봅니다

 

① SELECT * FROM table_name WHERE abc_column='a' ORDER BY a_column DESC  LIMIT 100;

     └ order by a_column은 정렬,  oder by a_column desc는 역순정렬,  limit 100 은 100개까지

 

   SELECT * FROM table_name WHERE a_column like '%aaa%';

     └ a_column 에서 aaa 를 포함하는 모든 레코드를 가져옴

 

   SELECT * FROM table_name WHERE a_column BETWEEN 10 AND 100;

     └ a_column 에서 10 ~ 100 사이의 값을 가진 레코드를 가져옴

 

   SELECT a_column FROM table_name GROUP BY a_column;

     └ a_column 의 같은 값끼리 그룹을 묶음.

 

   SELECT count(*) FROM table_name;

      └ 테이블의 전체 레코드 갯수를 가져옴

 

 

UPDATE table_a SET table_a . a_column = table_b . a_column FROM table_a, table_b

    WHERE table_a.a_column = table_b.a_column  ;

       └ 두개의 테이블에서 조건을 비교하여 업데이트

 

③ 문자관련 함수

    SELECT LEFT(a_column, 2) FROM table_name;     ← a_컬럼 에서 왼쪽부터 2자리 잘라서 가져온다.

    SELECT MID(a_column, 2, 4) FROM table_name;   ← a_컬럼 2자리부터 오른쪽으로 4자리 만큼 가져온다.

    SELECT RIGHT(a_column, 3) FROM table_name;   ← a_컬럼 에서 오른쪽부터 3자리 잘라서 가져온다.

    SELECT * FROM table_name WHERE LENGTH(a_column)=10;  ← a_컬럼에서 길이가 10인 레코드만

    UPDATE table_name SET a_column=REPLACE(a_column,'변경전글자','변경후글자');

       └ a_컬럼의 '변경전글자' 라는 문자열을 '변경후글자'로 바꾸어 a_컬럼 수정

    UPDATE table_name SET a_column=TRIM(a_column);

       └ a_컬럼의 왼쪽 오른쪽 공백을 모두 제거

     SELECT AVG(a_column),MIN(a_column),MAX(a_column),SUM(a_column) FROM table_name;   

       └ AVG : 평균값, MIN : 최소값, MAX : 최대값, SUM : 합계

     SELECT version(),user(),database();

        └ MySQL 버젼 , 유저 , 데이터베이스명 보기

 

④ 날자관련 함수

    SELECT NOW();

 

 

자~ 여기 부터는 조금더 기초를 넘어 MySQL 명령어 기본기 다지기 정도? 잠시 쉬어갑시다~

 

JOIN : a_테이블 과 b_테이블 에서 a_컬럼의 값이 같은 레코드만 가져옴

    SELECT a_table.a_column, b_talbe.a_column

    FROM a_talbe, b_table

    WHERE a_table.a_column = b_table.a_column;

 

   INNER JOIN : 테이블A 와 테이블B를 비교하여

 

테이블A와 테이블B의 컬럼a 값이 000 인 것의

테이블B 컬럼b 값을 가져오는 쿼리 입니다.

 

SELECT  b.column_b

FROM table_a as a
       inner join table_b as b on a.column_a=b.column_a
WHERE a.column='000'

 

 

 

 

UNION : a_테이블 과 b_테이블 에서 a_컬럼,b_컬럼 모든 값을 한꺼번에 가져옴

    SELECT a_column FROM a_table

    UNION

    SELECT b_column FROM b_table;

 

 

MySQL 은 공개형 데이터베이스로 누구든 라이센스 제한 없이 사용할 수 있습니다.

(공짜라고 절대 무시못할 엄청난 데이터베이스 입니다)

다운로드는 http://www.mysql.com/donwnloads 에서 하실수 있으며, 현재 버전 5.x 까지 나와있습니다~

 

쿼리분석기는 MySQLFRONT 를 사용하는데 그냥 저냥 아주 잘 쓰고 있답니다.

http://www.mysqlfront.de/wp/

 

 

 

 

반응형
Posted by 친절한 웬디양~ㅎㅎ
|