mysql table size

Original Post: https://stackoverflow.com/questions/9620198/how-to-get-the-sizes-of-the-tables-of-a-mysql-database/9620273#9620273

You can use this query to show the size of a table (although you need to substitute the variables first):

SELECT 
    table_name AS `Table`, 
    round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES 
WHERE table_schema = "$DB_NAME"
    AND table_name = "$TABLE_NAME";

or this query to list the size of every table in every database, largest first:

SELECT 
     table_schema as `Database`, 
     table_name AS `Table`, 
     round(((data_length + index_length) / 1024 / 1024), 2) `Size in MB`
FROM information_schema.TABLES 
ORDER BY (data_length + index_length) DESC;

MSSQL vesus MySQL

MSSQL 을 쓰다가 MySql을 셋팅하다 보니, 
다른 점과 불편한 점들이 있어서 몇 자 적어 놓는다.

가장 큰 차이점은

1. MySql은 limit 와 offset 개념이 있어서 paging 처리가 쉽다는 것.

2. MySql은 column data에서 boolean type 이 없어서, tinyint(1) 을 쓴다는 점. (이거 제일 처음에는 bit가 왜 없을까 고민하게 만들었었다…-_-;;)

3. MySql은  테이블마다 Database Engine 이라는 걸 셋팅할 수 있으며,
MySql Default 설치값이 MYISAM 이라는 Database Engine을 쓴다. 
근데 이 MYISAM이라는 녀석은 Foreign Key  Constraint 가 안 먹어서,
MSSQL은 그런걸 고민한 필요가 없었는데…-_-;;

아무튼 결론적으로다가  MySql에서는 InnoDB 를 Database Engine으로 셋팅해야
FK Constraint가 잘 먹어준다. 또한 Transaction도 실행시킬 수가 있다. 

4. Column 명, data value 에 해당하는 것들의 구분을 MSSQL에서는 ‘ 로 구분하지만,
MySQL 에서는 Column명에서는 `(키보드의 탭키 위쪽 물결 무늬랑 같은 키)로 구분한다. 

MySQL

insert into `table1` (`CustomerID`) values ('customer1');

참고 사이트 : http://www.people.vcu.edu/~agnew/Misc/MySQL-MS-SQL.HTML

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

5. MySQL은 Custom Data type을 지원하지 않는다. (이거 무지 불편하다.) -_-;;

6. MySQL은 varchar(xx) 와 같은 항목에서 min char을 설정하는 Constraint를 사용할 수 없다. (Trigger로 제어 불가능). 즉 DB단에서는 불가능하고, 프로그램에서 제어를 해야 한다.

7. MySQL은 Datetime Column에서 Default 값으로 now() 가 들어가지 않는다. 쓰고 싶다면 트리거를 설정해 줘야 한다. (근데 이 트리거가 또 권한이 보통 기존 권한으로 안되는 경우가 많다. -_-;;) 

CREATE  TRIGGER SomeTriggerName BEFORE INSERT
 ON SomeTableName
 FOR EACH ROW
SET New.SomeDatetimeColumnName = NOW()
;

8. sql hierarchical query를 처리하는 방식이 다르다. 이 부분은 내용을 정리해야 하는데, 시간이 없는 관계로다가, 간단한 내용 및 링크로 정리해 놓고 추후 정리할 시간이 있으면 정리해 보겠다.

9. bit 칼럼이 틀리다. MySQL 에서는 MSSQL에서 쓰는 Boolean 형태의 Bit 칼럼이 없다. 정확하게는 전혀 없는 건 아니고 동일한 기능은 Tinyint(1) 으로 대응되고 있다. 그런데, MySQL에서는 Bit 칼럼이 있다. 이건 MSSQL의 Bit와는 전혀 틀리다. Bitmask 칼럼이다. 아래 예제를 보면 명확해 질 듯.

ALTER TABLE DatabaseName.TableName
 Modify `ColumnName` BIT(4) DEFAULT b'0000' COMMENT '1:관심분야가 스포츠 2:관심분야가 예술 4:관심분야가 등산 8:관심분야가 공부'

 10. 아놔…미치겠다. mysql 은 서버 셋팅 기본값이 로그를 쌓아놓지 않는다. 이런 젠장할… 

11. 미치겠는 항목 하나 더 추가다.  InnoDB에서 auto_increment 가 mysql daemon이 restart 되면, 끊어진 번호에서부터 시작한다. 
예를 들어서, 8,9,10 이렇게 record가 insert 되고, 10번 record를 delete 하고, mysql 이 살아 있을 때는 insert 하게 되면 11번이 부여되지만, mysql을 restart 하게 되면 10번이 부여된다. 

http://dev.mysql.com/doc/refman/5.5/en/innodb-auto-increment-handling.html

http://serverfault.com/questions/228690/mysql-auto-increment-fields-resets-by-itself

링크를 참조하면 된다. 결국엔 연번을 채번하기 위해서는 오라클 방식으로 할 수 밖에 없을 것 같다.