对比项MyISAMInnoDB不支持主外键,支持事务,不支持行表锁,表锁,即使操作一条记录,也会锁住整张表,这不是适合高并发操作。行锁只在操作时锁定某一行,不影响其他行。适用于高并发操作。只缓存索引,不缓存真正的数据。不仅索引而且真实数据都被缓存。内存要求高,内存大小对性能有决定性的影响。表空间小,关注大默认情况下,YYMyISAM引擎会在执行查询语句SELECT`前自动对涉及的所有表加读锁,在执行增删改查前自动对涉及的表加写锁。对MyISAM表的操作会有以下几种情况:1、对MyISAM表的读操作(加读锁)不会阻塞其他线程对同一张表的读操作,但会阻塞其他线程对同一张表的写操作桌子。只有释放读锁后,才会执行其他线程的写操作。2、对MyISAM表的写操作(加写锁)会阻塞其他线程对同一张表的读写操作。只有释放写锁后,其他线程的读写操作才会被执行。MySQL的表级锁有两种模式:1.表共享读锁(TableReadLock)。2.独占表写锁(TableWriteLock)。MyISAM的读写锁调度是先写的,这也是MyISAM不适合作为主表引擎的原因。因为写锁后,其他线程不能进行任何操作,大量的写操作会使查询很难获得锁,造成永久阻塞。InnoDB存储引擎和MyISAM`存储引擎最大的区别有两个:一是支持事务,二是使用行锁。默认情况下,mysqlInnoDB引擎修改数据语句,update,delete,insert会自动对涉及到的数据加排它锁。默认情况下,select语句不会添加任何锁类型。如果加排他锁,可以使用select...forupdate语句。要添加共享锁,可以使用select...lockinsharemode语句。因此在其他事务中不能修改加了排他锁的数据行,也不能通过forupdate和lockinsharemodelock查询到数据,但是可以直接通过select...from...查询到数据,因为普通查询不会有任何锁定机制。因为InnoDB存储引擎实现了行级锁,虽然锁机制的实现带来的性能损失可能比表级锁更高,但是在整体并发处理能力上远优于MyISAM的表级.锁定。当系统并发较高时,InnoDB的整体性能与MyISAM相比会有明显的优势。间隙锁:当我们使用范围条件而不是相等条件来检索数据并请求共享锁或排他锁时,InnoDB将锁定满足条件的现有数据记录的索引项。对于条件模型中存在但不存在的键值记录称为“差距(GAP)”。InnoDB也会锁住这个“缺口”。这种锁的机制就是所谓的“间隙锁”。间隙锁的危害在于,如果在Query执行过程中进行了范围搜索,则会锁定整个范围内的所有索引键值,即使该键值不存在。间隙锁有一个比较致命的缺点,就是在锁定一个键值范围后,即使是一些不存在的键值也会被无辜地锁定,导致在加锁的时候无法在锁定的键值范围内插入任何数据。在某些情况下,这可能对性能非常不利。行锁:偏向于InnoDB存储引擎,开销大,加锁慢;可能会出现死锁;加锁粒度最小,锁冲突概率最低,并发度最高。
