特性 | MyISAM | InnoDB | MEMOERY | MERGE | NDB |
---|
存储限制 | 有 | 64TB | 有 | 没有 | 有 |
事务安全 | | 支持 | | | |
锁机制 | 表锁 | 行锁 | 表锁 | 表锁 | 行锁 |
B-Tree索引 | 支持 | 支持 | 支持 | 支持 | 支持 |
Hash索引 | | | 支持 | | 支持 |
全文索引 | 支持 | | | | |
集群索引 | | 支持 | | | |
数据缓存 | | 支持 | 支持 | | 支持 |
索引缓存 | 支持 | 支持 | 支持 | 支持 | 支持 |
数据压缩 | 支持 | | | | |
空间使用 | 低 | 高 | n/a | 低 | 低 |
内存使用 | 低 | 高 | 中 | 低 | 高 |
批量插入速度 | 高 | 低 | 高 | 高 | 高 |
支持外键 | | 支持 | | | |
数据类型优化
更小的通常更好:可以正确存储数据的最小数据类型
简单的数据类型就好
尽量避免NULL
整数类型(单位为位,可选UNSIDNED)
TINYINT | SMALLINT | MEDIUMINT | INT | BIGINT |
---|
8 | 16 | 24 | 32 | 64 |
实数类型:TYPE(n,m)
FLOAT(32bits),DOUBLE(64bits),DECIMAL
DECIMAL:只是一种储存格式,计算时会换成DOUBLE。
浮点数存储不精确,而DECIMAL精确计算代价太高。
当数字不大但要求精度很高时,如要精确到百万分之一,可以将数字乘以一百万,并储存为BIGINT.
字符串类型
VARCHAR:可变长字符串,但额外花费1,2个字节记录字符串的长度。
CHAT:定长字符串,插入数据时会自动删除最后的所有空格。很适合MD5或者Y/N这种。
TEXT:字符方式存储,像INT家族一样有一大堆家族
BLOB:二进制方式存储,同上
ENUM(‘A’,’B’):也可以考虑枚举类型,类似与外键
时间和日期类型
DATETIME: YYYYMMDDHHMMSS, 8个字节,仅储存字符串
TIMESTAMP: 从1970/1/1以来的秒数,4个字节,会根据时区自动变化
位数据类型:最好避免使用
mysql> create table bittest(
-> a bit(8));
Query OK, 0 rows affected (0.26 sec)
mysql> insert into bittest values
-> (b'00111001');
Query OK, 1 row affected (0.03 sec)
mysql> select a,a+0 from bittest;
+
| a | a+0 |
+
| 9 | 57 |
+
1 row in set (0.00 sec)