摘要
MySQL 由于性能高、成本低、可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在 Internet 上的中小型网站中。随着 MySQL 的不断成熟,它也逐渐用于更多大规模网站和应用,比如维基百科、Google 和 Facebook 等网站。非常流行的开源软件组合 LAMP 中的“M”指的就是 MySQL。
1.存储引擎 — MyISAM
vs InnoDB
(1)存储方式
每种存储引擎下的数据表创建成功后都会生成相应格式的文件
- MyISAM:
.frm
– 结构.MDY
– 数据.MYI
– 索引 - InnoDB:
.frm
– 结构.ibd
– 数据 索引
(2)物理顺序
MyISAM
: 依插入顺序
InnoDB
: 依主键顺序
(3)特定功能
MyISAM:
- 支持全文索引(鸡肋)
- 存储空间少
- 文件级别快速备份(将生成的文件直接拷贝到相应位置,需要还原时直接拷贝回来)
InnoDB:
- 外键
- 事务
- 行级锁定
(4)并发处理能力
MyISAM:
- 锁定粒度:表级
- 并发插入(在表中执行其他操作时,可以同事执行插入工作,大多数情况是不需要考虑锁的问题。因为插入不影响其他记录的操作,在最后插入)
InnoDB:
- 锁定粒度:表级 行级
- 多版本并发控制 MVCC(
Multi-Version Concurrency Control
),实现无阻塞读操作
Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
(5)空间空洞
MyISAM:
- 删除表中大量记录后,表结构的文件大小没有变化。需要手动修复空洞空间。
repair table table_name
InnoDB:
- 没有空洞现象。
(6)总结
MyISAM: 以读取和插入为主
InnoDB: 以更新和删除为主(写锁[独占锁,阻塞其他的所有操作])
总结:直接用 InnoDB。
2.字段类型
(1)varchar
vs char
varchar
:
- 优点:变长,占用的空间随着内容的增长而变大,节约空间
- 缺点:速度稍慢
char
:
- 优点:速度快
- 缺点:定长,永远占用 4 个直接,无论存储 0,-1,1234567 占用的空间是一致的。
(2)datetime
vs timestamp
timestamp
: 占用较少的空间,存储时间的范围小
datetime
: 占用较多的空间,存储时间范围大
(3)decimal
vs double
decimal
: 定点数,数据精确。变长的数据类型,随着存储的数据有效位增加,而占用更多的存储空间。
double
:浮点数,精度丢失。定长的数据类型,永远占用 8 个直接的存储空间(float4 个字节)
(4)enum
vs set
enum
: 枚举,使用一个数表示一个枚举值,占 2 个字节,一共 2^16 个枚举值
set
: 使用一个位表示一个元素值,占用 8 个直接,一共 8*8 个元素值