mysql中innodb和myisam的区别

1、innodb和myisam是什么?

    innodb和myisam是mysql最常用的两种存储引擎。

     MySQL 有多种存储引擎,每种存储引擎有各自的优缺点(第3节说)。可以使用命令“show engines”查看引擎(下图附命令以及显示内容)。

2、如何使用innodb和myisam? 

 mysql 5.5版本以及以后默认使用innoDB,如果创建表时候不指定存储引擎默认使用 innoDB,如果不想使用默认的存储引擎可以使用如下方法改变:

  a、表创建默认存储引擎:

    create table table_name(   
       id int primary key,   
       name varchar(50)   
    ) type=MyISAM;

    b、表级修改存储引擎:

       alter  table `Table_name`  engine= MyISAM;

    c、设置默认存储引擎,配置文件my.ini :

      my.ini,在[mysqld]最后添加为上default-storage-engine=myisam,重启服务

 

3、innodb和myisam区别?

1)、事务和外键

InnoDB具有事务,支持4个事务隔离级别(读未提交(Read Uncommitted),读已提交(Read Committed),可重复读(Repeated Read),串行化(Serializable)),回滚,崩溃修复能力和多版本并发的事务安全。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

2)、锁

mysql支持三种锁定级别,行级、页级、表级;

MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)

InnoDB支持行级锁,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,注意间隙锁的影响。

例如update table set num=1 where name like “%aaa%”

3)、并发

MyISAM读写互相阻塞:不仅会在写入的时候阻塞读取,MyISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。并发性能较差。

InnoDB 读写阻塞与事务隔离级别相关。

4)、索引

InnoDB(索引组织表)使用的聚簇索引、索引就是数据,顺序存储,因此能缓存索引,也能缓存数据。

MyISAM(堆组织表)使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引。

5)、存储

MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型, .frm文件存储表定义,数据文件的扩展名为.MYD,  索引文件的扩展名是.MYI。

InnoDB,基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小

注意:MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦

 

2)、全文索引(基本没人用,不需要关注,最好使用  ElasticSearch,Solr)

Innodb不支持全文索引,如果一定要用的话,最好使用sphinx等搜索引擎。myisam对中文支持的不是很好。

在 MySQL 5.7.6 之前,全文索引只支持英文全文索引,不支持中文全文索引,需要利用分词器把中文段落预处理拆分成单词,然后存入数据库。
从 MySQL 5.7.6 开始,MySQL内置了ngram全文解析器,用来支持中文、日文、韩文分词。

 

4、场景选择

MyISAM

  • 不需要事务支持(不支持)
  • 并发相对较低(锁定机制问题)
  • 数据修改相对较少(阻塞问题),以读为主
  • 数据一致性要求不是非常高
  1. 尽量索引(缓存机制)
  2. 调整读写优先级,根据实际需求确保重要操作更优先
  3. 启用延迟插入改善大批量写入性能
  4. 尽量顺序操作让insert数据都写入到尾部,减少阻塞
  5. 分解大的操作,降低单个操作的阻塞时间
  6. 降低并发数,某些高并发场景通过应用来进行排队机制
  7. 对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
  8. MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问

InnoDB 

  • 需要事务支持(具有较好的事务特性)
  • 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
  • 数据更新较为频繁的场景
  • 数据一致性要求较高
  • 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
  1. 主键尽可能小,避免给Secondary index带来过大的空间负担
  2. 避免全表扫描,因为会使用表锁
  3. 尽可能缓存所有的索引和数据,提高响应速度
  4. 在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
  5. 合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
  6. 避免主键更新,因为这会带来大量的数据移动

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章