[MySQL || MariaDB] InnoDB 총 정리
InnoDB
개념
Transaction-safe 한 Storage Engine으로 2005년 Oracle이 Innobase를 인수한 후 Oracle의 일부가 되었으며,
MySQL 5.5 이후 기본적으로 사용되고 있다. MyISAM 보다 많은 기능을 제공한다.
(MVCC 지원, ACID Transaction 처리, FK 지원, row-level lock 등)
또한 Undo, Tablespace 등 Oracle의 개념을 많이 수용하고 있다.
사용 정책의 경우 듀얼 라이선스 정책을 취하고 있는데 GNU GPL이면서도 상업적인 용도로 판매 가능하다.
MyISAM 대비 동시처리에 효과적인 구조로 되어 있다.
예를 들어 MyISAM은 Table과 Index를 각각 다른 파일로 관리하는데 반해 InnoDB는 Tablespace 개념을 사용한다.
사용 이유
대용량의 데이터를 컨트롤하는 경우
트랜잭션 관리가 필요한 경우
복구가 필요할 경우
정렬등의 구문이 들어가는 경우
IUD 등이 빈번하게 발생하는 경우
높은 퍼포먼스가 필요한 대용량 사이트에 적합
장점
데이터 무결성이 보장
동시성 제어가 가능
제약조건, 외래 키 생성이 가능
Row-level Lock (행 단위 Lock)을 사용하기 때문에 변경 작업(INSERT, UPDATE, DELETE)에 대한 속도가 빠름
트랜잭션을 지원해 transaction-safe 테이블 관리
MyISAM과 비슷하지만 ORACLE처럼 많은 기능을 지원
(Commit, Rollback, 장애 복구, row-level locking, 외래 키 등 다양한 기능을 지원)
단점
복구 방법 어려움
Dead lock 발생 가능성 있음
여러기능이 존재하므로 모델 디자인 시간↑
시스템 자원을 많이 차지함
Full-text 인덱싱이 불가능
생성 조건 및 지켜야 할 수칙
InnoDB table 생성시 체크할 항목
1. 테이블의 column은 1000개를 초과할 수 없다.
2. 내부 최대 Key length는 3500byte이지만, MySQL 자체는 1024byte로 제한한다
3. LongBlob 및 LongText 칼럼은 4GB 이하여야 한다.
4. Blob와 Text 칼럼을 포함한 총 length는 4G 이하여야 한다.
5. InnoDB는 내부적으로 65,535byte row-size를 지원하지만, 65,535 이상의 varchar를 포함한 칼럼은 정의할 수 없다
관련 에러
(ERROR 1114 (HY000): The table 'TBSOJM00' is full? )
원인
MySQL || MariaDB에서 테이블을 만들다 보면 4 G 이상의 크기가 되면 이런 류의 에러를 발생하게 됩니다.
이것은 테이블의 크기가 기본적으로 4GB로 되어 있기 때문에 발생하는 오류
해결 방법
관련 에러 2
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
원인
varchar()의 MAX_ROWS 설정값을 초과한 경우에 발생하는 경우가 많습니다.
저는 DB의 데이터를 다른 서버로 이전할 경우에 종종 발생합니다. 서버별로 DB의 설정이 달라서 발생하는 것 같습니다.
해결 방법
1.MAX_ROWS 값을 늘린다.
해결 : https://blog.lovetonight.net/tag/MAX_ROWS
2.varchar로 선언된 컬럼을 text 또는 blob 로 변경한다.
해결 : 말 그대로 컬럼 타입을 변경하시면 됩니다.
varchar의 자리가 65,535가 안 되는 것 같은데 왜 에러가 났지? 하시는 분들도 있을 겁니다.
그 이유는 바로 utf8 멀티 바이트를 쓰고 계시는 거죠
utf8는 3byte씩 차지하니까 계산기에 65535/3 하시면 됩니다.
귀찮으시죠? 제가 대신했습니다.
21,845가 나옵니다. 안전하게 utf8 멀티 바이트 테이블에 varchar는 21,800까지만 쓰시면 되겠습니다.
'MariaDB' 카테고리의 다른 글
[MySQL || MariaDB] 여러 테이블 한번에 카운터 하기 (0) | 2020.03.15 |
---|---|
[MySQL || MariaDB] ORDER BY 특정 값 우선 정렬(feat.FIELD) (2) | 2020.02.29 |
[MySQL || MariaDB] 데이터베이스 접근 권한 거부 Host 'IP' is not allowed to connect to this MySQL server (1) | 2019.11.19 |
[MySQL || MariaDB] 데이터 파일 IMPORT 하기(Feat.LOAD DATA INFILE) (0) | 2019.11.15 |
[MySQL || MariaDB] 자주 쓰는 날짜 API와 날짜 실전 예제 총 정리 (1) | 2019.11.12 |