一、MySQL的存储引擎
1.1 引擎
目前广泛使用的是MyISAM和InnoDB两种引擎:
1.1.1 MyISAM
MyISAM引擎是MySQL 5.1及之前版本的默认引擎,它的特点是:
- 不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁;
- 不支持事务;
- 不支持外键;
- 不支持崩溃后的安全恢复;
- 在表有读取查询的同时,支持往表中插入新纪录;
- 支持BLOB和TEXT的前500个字符索引,支持全文索引;
- 支持延迟更新索引,极大提升写入性能;
- 对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用。
1.1.2 InnoDB
InnoDB在MySQL 5.5后成为默认索引,它的特点是:
- 支持行锁,采用MVCC来支持高并发;
- 支持事务;
- 支持外键;
- 支持崩溃后的安全恢复;
- 不支持全文索引。
innodb引擎的4大特性答:
插入缓冲(insert buffer);
二次写(double write);
自适应哈希索引(ahi);
预读(read ahead)
InnoDB引擎的行锁是通过加在索引上实现的
ps: 据说InnoDB已经在MySQL 5.6.4支持全文索引了
1.2 myISAM 与 InnoDB 主要区别
- myisam 批量插入速度快,InnoDB慢,myisam插入数据时不排序
- InooDB支持事务,而MyISAM不支持事务;
- InnoDB不支持全文索引,myisam支持全文索引
- 锁机制,myisam是表锁,InnoDB是行锁
- myisam不支持外键,InnoDB支持外键
- InnoDB支持MVCC,而MyISAM不支持;
- InnoDB是索引组织表, myisam 是堆表;
- InnoDB表支持多种行格式, myisam 不支持;
- InnoDB不能通过直接拷贝表文件的方法拷贝表到另外一台机器, myisam 支持;
1.3 如何选择MySQL的存储引擎
- myISAM:
如果表对事务要求不高,同时是以查询和添加为主的。
比如 BBS中的发帖表,回复表 - InnoDB:
对事务要求高,保存的数据都是重要数据
比如 订单表,账户表 - Memory:
数据变化频繁,不需要入库同时又经常查询和修改
总体来讲,MyISAM适合SELECT密集型的表,而InnoDB适合INSERT和UPDATE密集型的表。
myisam与innodb select count(*)哪个更快,为什么?
答:myisam更快,因为myisam内部维护了一个计数器,可以直接调取。