MySQL引擎的理解
MySQL提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在MySQL中,不需要在整个服务器中使用同一种引擎,应该针对具体的要求,对每一个表使用不同的存储引擎。MySQL 5.6支持的存储引擎有InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE等。其中InnoDB是支持事务型的存储引擎,从MySQL 5.5之后,MySQL的默认事务引擎就是InnoDB了
MyISAM与InnoDB的区别
1、MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。不是事务安全的,而且不支持外键,如果执行大量的select,insert MyISAM比较适合。
2、InnoDB:支持事务安全的引擎,支持外键、行锁、事务是他的最大特点。如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。
锁方面的区别
读锁和写锁
- 读锁:也称共享锁,即一个共享锁在执行时,另一个共享锁也可以执行,并不阻塞.
- 写锁:也称排他锁,当表加上了读锁或者写锁,需要等待它们释放才能加上新的写锁。
区别
- MyISAM默认用的是表级锁,不支持行级锁(不支持事务)
- 默认情况下 MyISAM的select加的是读锁,update,insert,delete增加的是写锁,由于select的锁为读锁,所以在一个select时可以别的select并不阻塞,但update,insert,delete时阻塞(给整个表加锁),这种操作可以模仿事物,但是消耗非常巨大
- InnoDB默认用的是行级锁,也支持表记锁(支持事务)
- InnoDB支持事物和行级锁,这是InnoDB最大的特色
- InnoDB使用的是二段锁,即加锁和解锁是分两个步骤完成的,即先对同一个事务里的一批操作分别进行加锁,然后到commit的时候,在对事务里加上的锁进行统一的解锁
- InnoDB存储引擎通过Record Lock算法解决了脏读问题,通过Next-Key Lock算法解决了不可重复读和幻读问题,从而实现了四种隔离级别。
脏读 | 不可重复读 | 幻读 | 丢失更新 | |
READ UNCOMMITTED(读未提交) | Y | Y | Y | N |
READ COMMITTED(读已提交) | N | Y | Y | N |
REPEATABLE READ(默认 可重复读) | N | N | N | N |
SERIALIZABLE (序列化 最高级别) | N | N | N | N |
- Innodb的行锁模式有以下几种:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。
索引方面的区别
自动增长方面的区别
- myisam引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
- innodb引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。
主键区别
- myisam允许没有任何索引和主键的表存在,myisam的索引都是保存行的地址。
- innodb引擎如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),innodb的数据是主索引的一部分,附加索引保存的是主索引的值。
关于count()函数
- myisam保存有表的总行数,如果select count(*) from table;会直接取出出该值
- innodb没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。
全文索引
- myisam支持 FULLTEXT类型的全文索引
- innodb不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。(sphinx 是一个开源软件,提供多种语言的API接口,可以优化mysql的各种查询)
delete from table
使用这条命令时,innodb不会从新建立表,而是一条一条的删除数据
索引保存位置
- myisam的索引以表名+.MYI文件分别保存。
- innodb的索引和数据一起保存在表空间里。