1.INSERT 와 SELECT 구문을 주로 사용하는 경우
2.ROLLBACK 트랜잭션을 사용하지 않는 경우
3.테이블을 대규모로 동시에 읽고 쓰지 않는 경우
4.InnoDB 가 제공하는 특별 기능을 사용하지 않는 경우
5.FULLTEXT 인덱스를 사용하는 경우
6.공간적인 컬럼 타입을 사용하는 경우

이런 경우에 MyISAM이 좋습니다. 굳이 무거운 InnoDB 기능 사용 안하실라면....
MyISAM 강추요~



==========================


  

대부분 MyISAM보다 InnoDB스토리지 엔진을 선호합니다. InnoDB는 ACID 트랜잭션, 강제 참조 무결성 (외래 키), 그리고 행 단위의 락(lock)을 지원하기 때문이죠. 그러나 InnoDB는 메모리와 디스크 저장공간을 더 많이 잡아 먹습니다. 그래서 InnoDB의 특별한 기능을 사용하지 않는다면, MyISAM을 선택하는 것이 좋은 것 같습니다. 

 


=========================================

뭐 어떤 것이 더 우수하다는 것은 없고요. 
어떤 서비스를 하시느냐에 따라서 어떤 엔진을 쓰는 것이 좋은지는 있습니다. 
MyISAM과 InnoDB는 가장 대표적이라고 할 수 있는 MySQL의 대표 스토리지 엔진 타입이구요 
일단은 아래 그 두 엔진에 대해서 대략적인 설명을 적어 봤습니다. 
도움이 되셨으면 하네요. 
그럼.. 

MyISAM : 비-트랜젝션-세이프(non-transactional-safe) 테이블을 관리한다. 이 엔진은 전체 문장 검색 능력 뿐만 아니라, 고-성능 스토리지 밀 복구 기능을 제공한다. MyISAM은 모든 MySQL 구성에서 지원되며, 여러분이 MySQL을 다른 타입의 엔진으로 디폴트 구성하지 않는 한 이 엔진이 디폴트 스토리지 엔진으로 구성 

 1) 예전의 MySQL 의 Storage Engines 으로 MyISAM 을 사용했었습니다. 
    예를 들자면 블로그라던지, 게시판 처럼 한사람이 글을 쓰면 다른 많은 사람들이 글을 읽는 방식에 
    최적의 성능을 발휘를 하지요. 지금도 많이 사용하고 있는 방식입니다. 
 2) 제공하는 웹서비스다 그닥 크지 않다면 이것을 사용해도 괜찮다고 생각을 합니다 

InnoDB 및 BDB 스토리지 엔진은 트랜젝션에 안전한 테이블을 제공한다. BDB는 이 엔진을 지원하는 OS상의 MySQL-Max 바이너리 배포판에 포함되어 있다. InnoDB는 또한 모든 5.0 바이너리 배포판에 디폴트로 포함되어 있다. 소스 배포판의 경우, 여러분의 MySQL을 구성할때 선호하는 방식에 따라서 각각의 엔진을 활성화 또는 비활성화 시킬 수가 있다. 

 1) 트랜잭션-세이프 스토리지 엔진입니다. 
 2) MyISAM 과 비슷하지만 ORACLE 처럼 많은 기능을 지원을 합니다. 
  (* commit, rollback, 장애복구, row-level locking, 외래키 등) 
 3) 다수의 사용자 동시접속과 퍼포먼스가 증가하여 대용량 데이터를 처리할 때 최대의 퍼포먼스를 내도록 설계되었습니다. 
  CPU효율은 어느 디스크 기반의 데이터 베이스와 비교해도 손색이 없고 
  자체적으로 메인 메모리 안에 데이터 캐싱과 인덱싱을 위한 버퍼 풀(pool)을 관리합니다. 
 4) 테이블과 인덱스를 테이블 스페이스에 저장을 하고 테이블 스페이스는 몇개의 서버파일이나 디스크 파티션으로 
  구성되어있습니다. 이것은 MyISAM 과 다른 점인데, MyISAM은 테이블과 인덱스를 각각 분리된 파일로 관리합니다. 
  여기서 중요한것이 이제 InnoDB 를 제대로 사용을 하기 위해서는 테이블 스페이스 라는 개념을 파악을 하셔야합니다. 
  이것에 대해서는 밑에서 따로 언급을 하겠습니다. 
 5) InnoDB 테이블은 OS의 파일 사이즈 한계가 2GB이더라도 상관없이 어느 크기나 가질 수 있습니다. 
 6) InnoDB는 높은 퍼포먼스가 필요한 대용량 사이트에 적합합니다.



'MYSQL' 카테고리의 다른 글

MYSQL 외래키  (0) 2018.05.25
create index  (0) 2018.02.15
index 확인  (0) 2018.02.15
incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31

create table mytable ( 
id varchar(12) primary key not null,
name varchar(20) not null
) type=InnoDB;

create table subtable (
sub_id varchar(12) primary key not null,
id varchar(12) not null,
constraint fk_id foreign key ( id ) refrences mytable ( id ) on delete cascade
) type=InnoDB;
 

외래키를 설명하기 위한 아주 심플한 테이블 두개가 만들어 졌습니다. 위 테이블에서는 mytable의 id 컬럼을 참조하여
subtable의 id를 외래키(foreign key)로 만들었습니다. 

constraint fk_id foreign key( id ) references mytable ( id ) on delete cascade 이 부분이 foreign key를 설정하는 부분입니다. mytable의 primary key인 id 컬럼을 참조하여 subtable id 컬럼을 외래키(foreign key)로 참조하겠다는 뜻입니다.
뒤에 on delete cascade 는 옵션 구문인데 다음과 같은 뜻을 가지고 있습니다.

on delelete restrict | cascade | set null | no action | set default

위 옵션은 참조당하는 부모 테이블의 컬럼에 삭제되었을때 외래키가 어떻게 동작할 것인가에 대한 옵션입니다.
열심히 참조하고 있는데 홀연히 사라져 버리면 얼마나 당황 스러울까요? 

restrict - 참조하는 부모테이블의 column이 삭제되어도 지우지 말고 버텨라. 

cascade - 참조하는 부모테이블의 column이 삭제되면 자식 테이블의 column도 모두 삭제하라

set null - 참조하는 부모테이블의 column이 삭제되면 자식 테이블의 column이 모두 null 이 된다

no action - 참조하는 부모테이블의 column이 삭제되도 무시하라. 

set default - 참조하는 부모테이블의 column이 삭제되면 지정된 값으로 대체하라.

이제 잘 만들어진 위 두개의 테이블 중에서 자식 테이블인 subtable의 foreign 키를 alter table로 지워야 할 차례입니다.

[테이블에 외래키(foreign key) 삭제하기] 

형식) alter table [테이블명] drop foreign key [constraint에 줬던 foreign key 별명]

mysql> alter table subtable drop foreign key fk_id;

위에서는 제약조건으로 줬던 fk_id라는 foreign키를 삭제하고 있습니다.

[테이블에 외래키(foreign key) 추가하기]

형식) alter table [테이블명] add constraint [foreign key 별칭] foreign key ( 외래키를 줄 컬럼명 ) references
       [부모테이블명] (참조할 테이블명) [옵션]

mysql> alter table subtable add constraint fk_id foreign key ( id ) references mytable id on delete cascade;

형식만 들여다 보면 무지하게 까다로워 보이네요. 다 제가 무지한 탓입니다. 밑에 예를 들여 다 보면 별것 아니라는 것을 알 수 있을것입니다.

'MYSQL' 카테고리의 다른 글

MYISAM  (0) 2018.06.08
create index  (0) 2018.02.15
index 확인  (0) 2018.02.15
incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31


create index 인덱스이름 on 테이블(필드);


create index idx_goodscd on gd_goods(goodscd);


'MYSQL' 카테고리의 다른 글

MYISAM  (0) 2018.06.08
MYSQL 외래키  (0) 2018.05.25
index 확인  (0) 2018.02.15
incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31

show index from 테이블;

'MYSQL' 카테고리의 다른 글

MYSQL 외래키  (0) 2018.05.25
create index  (0) 2018.02.15
incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31
mysql alter table  (0) 2017.12.30

회사 서버에선 이상이 없던 솔루션이 다른업체 서버에선 insert, update만 하려고 하면 아래와 같은 에러가 떴다.


incorrect integer value: '' for column


에러 내용만 읽어봐도 왜 그런지 답이 나온다. 

정수형 필드에 '' 값이 들어가기 때문이다.


시간이 없으니 수천개의 파일을 일일히 수정할수는 없으니 미칠 노릇이였다.

구글링 끝에 찾아낸 방법은 my.ini 수정이였다.


sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

위와 같은 sql-mode에서


sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

STRICT_TRANS_TABLES를 없애면 된다.


my.ini 변경하고 mysql 재시작하면 적용완료. 이상없음 확인 끝.


'MYSQL' 카테고리의 다른 글

create index  (0) 2018.02.15
index 확인  (0) 2018.02.15
MYSQL 파티셔닝  (0) 2017.12.31
mysql alter table  (0) 2017.12.30
Can't find record in  (0) 2017.12.30

MySQL에서는 대용량 데이터 관리를 위해 파티셔닝을 지원한다

(스토리지가 MyISAM이나 InnoDB 상관없이 지원하며 5.1 이상부터 지원)


우선 파티션을 나누기전에 CREATE시에 파티션을 설정해줘야 하며 그 이후부터 파티션추가는 ALTER 문으로 가능하다.

즉, 이미 파티션을 나누지 않은 일반 테이블이 있다면 삭제 후 다시 CREATE를 해줘야 한다.


파티션을 추가하는 것은 아래와 같다

CREATE TABLE `테이블` (

...

)

PARTITION BY RANGE (to_days(날짜컬럼)) (

    PARTITION p201709 VALUES LESS THAN ( to_days('2017-08-01 00:00:00') ) ENGINE=InnoDB,

    PARTITION p_max VALUES LESS THAN MAXVALUE ENGINE=InnoDB

);


위 파티션을 월단위로 파티션을 나눠놓은것으로 month함수는 지원하지 않으므로 to_days 함수를 통해 날짜컬럼을 기준으로 RANGE 형태

파티션을 나눈 것이다.(그래서 THAN() 에서 괄호안에 보통 날짜를 입력하면 되지만 unix time값으로 작성해야 하므로 함수를 이용)


여기서 주의할 점은 CREATE문이 생략됏는데, PRIMARY KEY를 보통 AI만 할텐데, 반드시 파티션을 나누는 기준이 되는 날짜컬럼을 같이 지정해줘야 한다.

즉, AI 값과 파티션 기준값을 같이 묶어서 PK로 지정해줘야 한다.


파티션을 년단위로 나눌경우는 to_days함수대신 year함수를 쓰면되고 THAN(값)에는 년도를 입력하면 된다.


파티션으로 나눠놓은 날짜보다 더 이전의 날짜의 데이터는 최소단위 파티션에 쌓이고, 그보다 더 큰 날짜의 데이터는 MAXVALUE로 지정한 p_max(예시) 에 쌓인다.


파티션 추가는 아래 명령어를 사용하며, 해당 날짜에 맞춰서 기존 데이터가 생성된 파티션으로 이동한다.

ALTER TABLE `테이블` PARTITION BY RANGE(함수(`필드명`)) (

    PARTITION `파티션명` VALUES LESS THAN (값),

    PARTITION `파티션명` VALUES LESS THAN (값)

)


여기서 주의할점은 이미 MAXVALUE가 설정이 된 경우는 마지막 날짜 기준 뒤의 날짜는 파티션추가가 안되므로 파티션을 재구성 해야한다

파티션 재구성은 아래와 같다

ALTER TABLE TBL_REQUEST_RESULT REORGANIZE PARTITION p_max INTO (

    PARTITION p201710 VALUES LESS THAN (to_days('2017-09-01 00:00:00')) ENGINE=InnoDB,

    PARTITION p_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB

);


파티션 삭제는 아래 명령어를 사용하며, 해당 파티션에 저장된 데이터는 삭제된다.

ALTER TABLE `테이블` DROP PARTITION `파티션명`;


파티션 확인 및 관리 명령어는 아래와 같다.

SHOW VARIABLES LIKE '%partition%'

ALTER TABLE REBUILD PARTITION;

ALTER TABLE OPTIMIZE PARTITION;

ALTER TABLE ANALYZE PARTITION;

ALTER TABLE REPAIR PARTITION;

ALTER TABLE CHECK PARTITION;


파티션 완전 삭제 명령어는 아래와 같다.

ALTER TABLE `테이블` REMOVE PARTITIONING;


'MYSQL' 카테고리의 다른 글

index 확인  (0) 2018.02.15
incorrect integer value: '' for column  (0) 2018.01.05
mysql alter table  (0) 2017.12.30
Can't find record in  (0) 2017.12.30
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'  (0) 2017.12.29

필드 추가

alter table 테이블명 add 추가필드명 varchar(10) default '';


필드 제거

alter table 테이블명 drop 제거필드명;


필드 수정

alter table 테이블명 modify 수정필드명 varchar(10) default ''


'MYSQL' 카테고리의 다른 글

incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31
Can't find record in  (0) 2017.12.30
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'  (0) 2017.12.29
mysql dump 넣기 import  (0) 2017.12.29

Can't find record in ... 


에러가 발생하는건 master와 slave 간에 데이터가 일치 하지 않을때 발생합니다.


master와 slave의 데이터를 맞춰 줘야 해결이 됩니다.

'MYSQL' 카테고리의 다른 글

incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31
mysql alter table  (0) 2017.12.30
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'  (0) 2017.12.29
mysql dump 넣기 import  (0) 2017.12.29

yum 으로 mysql 설치시 발생할수 있음


Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'


에러 발생시 원인은 socket 파일이 다른 경로에 있어서 이다.


mysql -u아이디 -p패스워드 DB명 < 파일.sql --socket=/var/lib/mysql/mysql.sock


이런식으로 socket에 경로를 넣어주면 해결된다.


or


my.conf 파일에 경로를 다시 설정해줘도 됨



'MYSQL' 카테고리의 다른 글

incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31
mysql alter table  (0) 2017.12.30
Can't find record in  (0) 2017.12.30
mysql dump 넣기 import  (0) 2017.12.29

mysql -u아이디 -p비밀번호 db명 --default-character-set=utf8 < 파일



'MYSQL' 카테고리의 다른 글

incorrect integer value: '' for column  (0) 2018.01.05
MYSQL 파티셔닝  (0) 2017.12.31
mysql alter table  (0) 2017.12.30
Can't find record in  (0) 2017.12.30
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'  (0) 2017.12.29

+ Recent posts