Mysql MyISAM与InnoDB 表锁行锁以及分库分表优化

一、 两种存储引擎:MyISAM与InnoDB 区别与作用

1. count运算上的区别:

因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。

2. 是否支持事务和崩溃后的安全恢复:

MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但不提供事务支持。InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

3. 是否支持外键:

MyISAM不支持,而InnoDB支持。

 

1. 2 MyISAM特点(5.5 版本前默认引擎)

 

  1. MyISAM:只支持表级锁,不支持行锁。用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁 (读取时对需要读到的所有表加锁,写入时则对表加排他锁;)

  2. 不支持事务

  3. 不支持外键

  4. 不支持崩溃后的安全恢复

  5. 在表有读取查询的同时,支持往表中插入新纪录

  6. 支持BLOB和TEXT的前500个字符索引,支持全文索引

  7. 支持延迟更新索引,极大地提升了写入性能

  8. 对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用

 

1.2.2 表锁与行锁 hang锁

 

  • 计算机(Mysql)协调多个进程或线程并发访问某一表或某行数据的机制
  1. 表锁: 每次操作锁住整张表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;

  2. 行锁: 每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高;

 

1.3 InnoDB (5.5 版本后默认引擎

 
注意:InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

  1. 支持行锁,采用MVCC来支持高并发,有可能死锁
  2. 支持事务
  3. 支持外键
  4. 支持崩溃后的安全恢复
    不支持全文索引

 

1.4 综上

所以:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。

猜你喜欢

转载自www.cnblogs.com/shiqi17/p/9702522.html
今日推荐