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的索引和数据一起保存在表空间里。