MySQL 기술사양

MySQL의 내부구조 및 이식성 (portability)

  • 개발언어
    • C 및 C++ 언어로 개발되어 수 십 가지의 다양한 하드웨어 상에서 손쉽게 이용할 수 있음.
  • 이식성
    • 이식성 증진을 위해 GNU Automake, Autoconf 및 Libtool 등을 사용하면서도
      수 많은 다른 컴파일러로 테스트
    • 가용한 API: C, C++, Eiffel, Java, Perl, PHP, Python, Ruby, 및 Tcl
  • 스토리지 엔진
    • 6가지의 (transactional 및 non-transactional) 스토리지 엔진 중 요구에 맞는 것을 선택가능.
  • 고 성 능
    • 스레딩 기술
      • 커널 스레드 (Kernel threads)를 통해 완전한 멀티 스레딩을 지원하므로 다중 프로세서 시스템 자원을 효과적으로 이용할 수 있음.
      • 스레드 기술에 기반한 메모리 할당기술 채택(thread-based allocation system)
      • 트랜잭션 (transactional)용 그리고 비 트랜잭션 (non-transactional)용 스토리지 엔진을 제공.
      • 고성능의 B-tree disk tables ( MyISAM) 과 인덱스 압축 (index compression) 기능.
      • 다층 구조로 설계되어 새로운 스토리지 엔진을 적용하기가 비교적 용이하므로
        사용자 편의에 따라 SQL interface를 추가할 수 있음.
      • 매우 빠른 스레드 기반의 메모리 할당 (thread-based memory allocation) 기능.
    • 인덱스
      • 고속의 B-tree 디스크 테이블(MyISAM)과 인덱스 압축기술 채용.
    • JOIN:
      • 최적화된 one-sweep multi-join 기술을 채택하여 join의 성능이 크게 개선.
    • Hash 테이블
      • 메모리 해쉬 테이블 (In-memory hash table)을 구성하고 이를 temporary 테이블로 활용.
      • MySQL는 각종 메모리검사 (memory leakage detector)를 통해 안정성이 완벽하게 검증됨.
    • SQL함수
      • SQL함수를 처리할 때 최적화된 class library를 이용함.
      • 또한 질의어 초기화 (query initialization) 후에는 메모리 할당 작업이 전혀 발생하지 않음.
  • Column Types
    • 다양한 column type 지원: signed/unsigned integers 1, 2, 3, 4, 8 바이트 길이.
    • FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME,
      TIMESTAMP, YEAR, SET, ENUM, 및 OpenGIS spatial type .
    • 고정길이 (Fixed-length) 및 가변길이 (variable-length)레코드
  • 명령어 및 함수
    • 질의어 (query)상의 SELECT 및 WHERE 문 안에서 다양한 연산자 (operator) 및 함수 지원.
      mysql> SELECT CONCAT(first_name, ' ', last_name)
      -> FROM citizen
      -> WHERE income/dependents > 10000 AND age > 30;
    • SQL GROUP BY 및 ORDER BY 문 지원 및 그룹 함수의 지원
    • COUNT(), COUNT(DISTINCT ...), AVG(), STD(), SUM(), MAX(), MIN(), GROUP_CONCAT( )
    • LEFT OUTER JOIN 및 RIGHT OUTER JOIN을 표준 SQL문 및 ODBC syntax와 함께 지원.
    • 테이블 및 column에 대한 alias 지원 (표준 SQL.)
  • MySQL에 특별한 명령어
    • SHOW 명령어 ? 데이터베이스, 테이블 및 인덱스에 대한 정보를 보고자 할 때 이용.
    • EXPLAIN 명령어 ? 최적화기 (optimizer)가 질의어를 처리 (resolve)하는 방법을 결정.
    • Function 이름을 Table이나 column이름으로 사용할 수도 있음.
      (예: ABS를 column 이름으로 사용할 수도 있음. 단, 함수 명에 공백문자를 가지지 않으면 됨)

MySQL의 보안

  • Privilege 및 암호관리를 통해 호스트 기반에서 확인합니다.
    (모든 암호는 네트워크 상에서 암호화(encrypted))
  • SSL을 통한 전송계층 암호화를 지원합니다.
  • 서버의 자원을 사용자별로 할당할 수 있습니다.

MySQL의 확장성

  • 대규모 DB 처리 - 5천만 개의 record를 가지는 데이터베이스를 MySQL에서 처리.
    심지어 6만개의 테이블과 50 억 개의 레코드를 처리하는 사례도 보고됨 .
  • 테이블 당 최대 64개의 인덱스를 가질 수 있으며 각 인덱스는 1~6개의 column으로 구성됩니다.
  • 개별 Index의 최대 길이는 1000 바이트까지 가능합니다.

MySQL에서의 복제기능

  • 하나의 master서버와 다수의 slave 서버 서버 운영이 가능하여 속도와 안정성이 향상되었습니다.

MySQL의 전문 인덱스 화 및 검색 기능

  • 문장 전체의 인덱스화 (Full-text index)를 통해 빠르고 다양한 검색이 가능합니다.

MySQL의 임베디드 용 라이브러리

  • DB 라이브러리 (libmysqld)를 다양한 전자기기 응용업무에 내장하여 활용할 수 있습니다.

MySQL에서의 유니코드 지원

  • 서버, 데이터베이스, 테이블 또는 필드단위에서도 특정 문자 (character set)을 지원합니다.
  • 또한 문자간 변환도 자유롭습니다. 유니코드 데이터를 UCS2 및 UTF8 encoding방식으로 저장합니다.

MySQL에서의 subquery에 대한 확장지원

  • Subquery를 통해 한 질의어의 결과치를 더 큰 질의어에 적용할 수 있습니다.
  • 이를 통해 INSERT INTO ... SELECT ... 와 같은 형태로 활용할 수 있습니다.

MySQL의 GIS (Geographical Data) 지원기능

  • Open GIS Consortium에서 제안된 SQL92의 하부기능으로서의 Geometry Type을 지원합니다.
  • 즉, 지리 데이터를 포함한 다양한 공간(spatial) 데이터를 효율적으로 보관 및 처리할 수 있습니다.

MySQL의 연결성

  • 클라이언트는 TCP/IP 소켓을 이용하여 어떤 플랫폼에서도 MySQL 서버에 접속할 수 있습니다.
  • 클라이언트는 named pipe (Windows NT계열) 또는 socket 파일(Unix)을 이용하여 접속합니다.
  • Connector/ODBC 인터페이스를 통해 클라이언트 프로그램이 MySQL을 이용할 수 있습니다.
    (MS Access에서 MySQL 서버 접속이 가능. 클라이언트는 Windows/Unix 모두 클라이언트가능)
  • Connector/JDBC 인터페이스를 통해 Java 클라이언트 프로그램에서 MySQL을 이용할 수 있습니다.

MySQL에서의 지역화 (Localization)

  • 다양한 나라의 언어를 지원합니다.
  • 일반적인 스트링 column에 대한 비교작업은 대/소문자를 구별하지 않습니다.
  • 서버에서 제공하는 일체의 에러 메시지에 여러 나라의 언어를 적용할 수 있음 .
  • 지원하는 문자 세트 (character set)에는 latin1 (ISO-8859-1), german , big5 , ujis , 한글
    등이 모두 포함되며 Unicode도 또한 지원됨 .
  • 정렬 (Sorting)은 선택된 문자 세트에 의하여 수행되며 MySQL이 수행되는 중에도 이를 바꿀 수 있음 .

MySQL 클라이언트와 Tool 들

  • MySQL 서버에서 테이블을 검사 (check), 최적화 (optimize), 교정 (repair)하는 기능을 내장하며
    또한 명령어 줄에서도 mysqlcheck 클라이언트 프로그램을 통해 이를 이용할 수 있음.
    아울러 MyISAM 테이블에서는 myisamchk 을 이용할 수 있음 .
  • 모든 MySQL 프로그램에서는 --help 또는 -? Option 을 통해 온라인 도움말을 제공받음 .

MySQL 에서의 최대 테이블 크기

  • MySQL 3.23 이래로 MyISAM storage engine 에서 최대 테이블 크기는 8백만 terabytes (263 바이트)로 늘어났습니다 .
    즉 , 사실상 최대의 테이블 크기는 각각 운용되는 운영체제의 한계에 따르게 되었습니다 .
  • InnoDB 에서의 테이블은 여러 개의 파일을 통해 생성되는 테이블 스페이스 (tablespace)에서 유지되므로 개별 파일 사이즈의 한계를 초과하게 되었습니다 . 즉 , 테이블공간 (tablespace)은 raw disk partition을 이용할 수 있게 되어 최대 한계치는 64TB가 되었습니다 .
  • 파일 크기의 한계치를 주요 운영체제 별로 살펴보면 다음과 같습니다 .


    운영체제

    최대 파일 크기

    Linux 2.4

    4TB(ext3 파일 시스템)

    Solaris 9/10

    16TB

    Win32 w/FAT/FAT32

    2TB(증가 시킬 수 있음)

    MacOS X w/HFS+

    2TB

  • 일반 상태에서 MyISAM 테이블의 최대 크기는 다음의 명령어를 통해 확인이 가능.
    SHOW TABLE STATUS
    myisamchk -dv tbl_name
  • 만약 더 큰 MyISAM 테이블이 필요 하다면, 그리고 운영체제가 이러한 큰 파일을 지원 한다면, CREATE TABLE 명령어에서 AVG_ROW_LENGTH 및 MAX_ROWS option을 이용해서 가능함.
    (이미 만들어진 테이블에 대해서는 ALTER TABLE 명령어를 이용할 수 있음)
  • 그 이외 파일 크기의 한계를 넘어설 수 있는 방법으로는 :
  • 이러한 대형 테이블인 read-only라면 myisampack 을 통해 압축.
    myisampack 는 통상 약 절반 크기로 테이블을 압축할 수 있으므로 그만큼 더 큰 테이블을 만들 수 있음.
    또한 myisampack 을 이용하면 여러 개의 테이블을 병합해서 하나의 테이블로 만들 수 있음 .
  • 이 때 MyISAM 데이터 파일을 이용함에 있어서의 운영체제 상의 파일 시스템의 한계를 벗어나기 위해서는
    RAID 옵션을 사용할 수 있음.
  • MySQL 의 MERGE 라이브러리를 통해 여러 개의 MyISAM 테이블을 모아서 하나의 커다란 MERGE table 을 만들 수 있음 .