我都把MySql啃得这么透彻了,你还不进来看一下吗?

在数据库中存的就是一张张有着千丝万缕关系的表,因此表的设计的好坏,将直接影像这整个数据库。而在设计表的时候,咱们都关注一个问题,使用什么存储引擎。接下来小编将重点为你们介绍对比两种常见的innodb和MyISAM搜索引擎~mysql

友情连接:MySQL笔记文档算法

一 事务

一、innodbsql

  • 具备事务,支持4个事务隔离级别,其中四种隔离有:

a、Serializable (串行化):可避免脏读、不可重复读、幻读的发生。数据库

b、Repeatable read (可重复读):可避免脏读、不可重复读的发生。(默认的数据库隔离级别)缓存

c、Read committed (读已提交):可避免脏读的发生。安全

d、Read uncommitted (读未提交):最低级别,任何状况都没法保证。服务器

  • 回滚,崩溃修复能力和多版本并发的事务安全,包括ACID事务,事务ACID指 原子性

(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。markdown

二、MyISAM并发

  • 管理非事务表
  • 提供高速存储和检索,以及全文搜索能力

三、总结:高并发

  • 若是须要执行大量的INSERT或UPDATE操做,则应该使用InnoDB,这样能够提升多

用户并发操做的性能。

  • 若是须要执行大量的SELECT查询,那么MyISAM是更好的选择。

二 行级锁和外键约束

mysql支持三种锁定级别,行级、页级、表级。其中:

表级:直接锁定整张表,在你锁按期间,其它进程没法对该表进行写操做。若是你是写锁,则其它进程则读也不容许行级:仅对指定的记录进行加锁,这样其它进程仍是能够对同一个表中的其它记录进行操做

页级:表级锁速度快,但冲突多,行级冲突少,但速度慢。因此取了折衷的页级,一次锁定相邻的一组记录

一、InnoDB

支持行级锁定,可是表的行锁也不是绝对的,若是在执行一个SQL语句时MySQL不能肯定要扫描的范围

即 update table_name set age='24' where name like '%福%';不明确主键,在执行增删改查操做时,会锁全表

二、MyISAM

支持表级锁定,没有提供对数据库事务的支持,也不支持行级锁和外键,所以当INSERT(插入)或UPDATE(更新)数据时即写操做须要锁定整个表

三 存储

一、InnoDB

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

二、MyISAM

  • 索引和数据是分开的,而且索引是有压缩的。
  • 在磁盘上存储成三个文件。一个是.frm文件用于存储表的定义,一个是.MYD文件用于

存储表的数据,另外一个是.MYI文件,存储的是索引。操做系统对大文件的操做是比较

慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据天然能够优化数据

库的查询等操做。有索引管理和字段管理。

四 索引

一、InnoDB(索引组织表)

使用的聚簇索引、索引就是数据,顺序存储,所以能缓存索引,也能缓存数据

二、MyISAM(堆组织表)

使用的是非聚簇索引、索引和文件分开,随机存储,只能缓存索引

我都把MySql啃得这么透彻了,你还不进来看一下吗?

五 服务器数据备份

一、InnoDB

必须导出SQL来备份,LOAD TABLE FROM MASTER操做对InnoDB是不起做用的,解决方法是首先把InnoDB表改为MyISAM表,导入数据后再改为InnoDB表,可是对于使用的额外的InnoDB特性(例如外键)的表不适用。

二、MyISAM

应对错误编码致使的数据恢复速度快。MyISAM的数据是以文件的形式存储,因此在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操做。

我都把MySql啃得这么透彻了,你还不进来看一下吗?

六 使用场景

一、InnoDB

  • 须要事务支持(具备较好的事务特性)
  • 行级锁定对高并发有很好的适应能力,但须要确保查询是经过索引完成
  • 常常更新的表,适合处理多重并发的更新请求
  • 数据一致性要求较高
  • 硬件设备内存较大,能够利用InnoDB较好的缓存能力来提升内存利用率,尽量减小磁盘 IO
  • 主键尽量小,避免给Secondary index带来过大的空间负担
  • 避免全表扫描,由于会致使锁表。(sql语句中含有where条件同时明确主键)
  • 尽量缓存全部的索引和数据,提升响应速度
  • 在大批量小插入的时候,尽可能本身控制事务而不要使用autocommit自动提交
  • 合理设置innodb_flush_log_at_trx_commit参数值,不要过分追求安全性
  • 避免主键更新,由于这会带来大量的数据移动

二、MyISAM

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

七 Innodb和MyIASM的引擎原理

一、Innodb

  • 引擎的索引结构,使用B+Tree做为索引结构
  • InnoDB的数据文件自己就是索引文件,数据文件自己就是按B+Tree组织的一个索引

结构,这棵树的叶节点data域保存了完整的数据记录,这种索引就是汇集索引。

  • 主键索引:

a、由于InnoDB的数据文件自己要按主键汇集,因此InnoDB要求表必须有主键(MyISAM能够没有)。

b、若是没有显式指定,则MySQL系统会自动选择一个能够惟一标识数据记录的列做为主键。

c、若是不存在惟一标识数据记录的列,则MySQL自动为InnoDB表生成一个隐含字段做为主键,这个字段长度为6个字节,类型为长整形。

我都把MySql啃得这么透彻了,你还不进来看一下吗?

  • 辅助索引

InnoDB的辅助索引data域存储相应记录主键的值而不是地址即InnoDB的全部辅助索引都引用主键做为data域

我都把MySql啃得这么透彻了,你还不进来看一下吗?

二、MyIASM

  • 引擎的索引结构:使用B+Tree做为索引结构
  • MyISAM索引实现:

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址,即叶节点的data域存放的是数据记录的地址

  • 索引检索的算法:

首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,则取出其data域的值,而后以data域的值为地址,读取相应数据记录。

  • 主键索引和辅助索引(结构上没有任何区别,只是主索引要求key是惟一的,而辅助索引的key能够重复)

我都把MySql啃得这么透彻了,你还不进来看一下吗?

三、注意

  • 对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,可是在

MyISAM表中,能够和其余字段一块儿创建联合索引。

  • InnoDB 中不保存表的具体行数,也就是说,执行select count() fromtable时,

InnoDB要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行

数便可。注意的是,当count()语句包含where条件时,两种表的操做是同样的

相关文章
相关标签/搜索