几种常用引擎介绍
1, MyISAM引擎
特点
1, 不支持事务
事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。
2, 表级锁定
数据更新时锁定整个表:其锁定机制是表级锁定,也就是对表中的一个数据进行操作都会将这个表锁定,其他人不能操作这个表,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能
3, 读写互相阻塞
不仅会在写入的时候阻塞读取,MyISAM还会再读取的时候阻塞写入,但读本身不会阻塞另外的读
4, 只会缓存索引
MyISAM 可以通过key_buffer_size 的值来提高缓存索引,以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。
5, 读取速度快
占用资源相对较少
6, 不支持外键约束,但只是全文索引
7, MyISAM引擎是MySQL5.5版本之前的默认引擎,是对最初的ISAM引擎优化的产物。
业务场景:
1, 不需要事务支持的业务
2, 一般为读数据比较多的应用,读写都频繁场景不适合,读多或者写多的都适合
3, 读写并发访问都相对较低的业务
4, 数据修改相对较少的业务
5, 以读为主的业务
6, 对数据一致性要求不是很高的业务
7, 中小型的网站部分业务会用
调优精要:
1, 设置合适的索引
2, 调整读写优先级,根据实际需求确保重要操作更优先执行,读写的时候可以通过参数设置优先级
3, 启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)
4, 尽量顺序操作让insert数据都写入道尾部,较少阻塞
5, 分解大的操作,降低单个操作的阻塞时间,就像操作系统控制cpu分片一样
6, 降低并发数,某些高并发某些高并发场景通过应用进行排队队列机制Q队列
7, 对于相对静态的数据库数据,充分利用Query Cache或mecached缓存服务可以极大的提高访问频率
8, MyISAM的Count只有再全表扫描的时候特别高效,带有其他条件的count都需要进行实际
不支持事务、表锁设计、支持全文索引,主要面向一些 OLAP 数 据库应用,在 MySQL 5.5.8 版本之前是默认的存储引擎(除 Windows 版本外)。数据库系统 与文件系统一个很大的不同在于对事务的支持,MyISAM 存储引擎是不支持事务的。究其根 本,这也并不难理解。用户在所有的应用中是否都需要事务呢?在数据仓库中,如果没有 ETL 这些操作,只是简单地通过报表查询还需要事务的支持吗?此外,MyISAM 存储引擎的 另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与 大多数的数据库都不相同。
2. InnoDB引擎
特点:
1, 支持事务,支持4个事务隔离界别,支持多版本读
2, 行级锁定:通过索引实现,全表扫描仍然会是表锁,注意间隙的影响
3, 读写阻塞与事务隔离级别相关
4, 具体非常高效的缓存特性:能缓存索引,也能缓存数据
5, 整个表和主键与cluster方式存储,组成一颗平衡树
6, 所有secondaryIndex都会保存主键信息
7, 支持分区,表空间,类似oracle数据库
8, 支持外键约束
9, 对硬件要求比较高
业务场景:
1, 需要事务支持(具有较好的事务特性)
2, 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
3, 数据更新较为频繁的场景
4, 数据一致性要求较高的业务
5, 硬件设备内存较大
6, 更消耗资源,没有MyISAM引擎快
InnoDB引擎调优精要 1.主键尽可能小,避免给Secondery index带来过大的空间负担。 2.避免全表扫描,因为会使用表锁。 3.尽可能缓存所有的索引和数据,提高响应速度,较少磁盘IO消耗。 4.在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交,有开关可以控制提交方式。 5合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。 如果innodb_flush_log_at_trx_commit的值为0,log buffer每秒就会被刷写日志文件到磁盘,提交事务的时候不做任何操作。 6.避免主键更新,因为这会带来大量的数据移动。 可以看一看InnoDB的重要参数学习一下。
InnoDB 存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒一样由 InnoDB 存储引擎自身来管理。从 MySQL 4.1(包括 4.1)版本开始,可以将每个 InnoDB 存储引擎的 表单独存放到一个独立的 ibd 文件中。此外,InnoDB 存储引擎支持将裸设备(row disk)用 于建立其表空间。
InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准 的 4 种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来 避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,每张表都是按 主键的顺序进行存储的,如果没有显式地在表定义时指定主键,InnoDB 存储引擎会为每一 行生成一个 6 字节的 ROWID,并以此作为主键。
InnoDB 存储引擎是 MySQL 数据库最为常用的一种引擎,Facebook、Google、Yahoo 等 公司的成功应用已经证明了 InnoDB 存储引擎具备高可用性、高性能以及高可扩展性。对其 底层实现的掌握和理解也需要时间和技术的积累。如果想深入了解 InnoDB 存储引擎的工作 原理、实现和应用,可以参考《MySQL 技术内幕:InnoDB 存储引擎》一书。
事务介绍:
四大特性:
1, 原子性:
事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生
2, 一致性
事务发生前和发生后,数据的完整性必须保持一致
3, 隔离性:
当并发访问数据库时,一个正在执行的事务在执行完毕前,对于其他的会话是不可见的,多个并发事务之间的数据是相互隔离的,
4, 持久性
一个事务一旦被提交,它对数据中的数据改变就是永久性的。如果出了错误,事务也不许撤销,只能通过‘补偿性事务’
事务的开启:
数据库默认事务时自动提交的,也就是发一条sql它就执行一条
#NDB 存储引擎 2003 年,MySQL AB 公司从 Sony Ericsson 公司收购了 NDB 存储引擎。 NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。 #Memory 存储引擎 正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。 #Infobright 存储引擎 第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。 #NTSE 存储引擎 网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。 #BLACKHOLE 黑洞存储引擎,可以应用于主备复制中的分发主库。
文件作用介绍:
1. db.opt文件:用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性。 2.后缀名为.frm的文件:这个文件主要是用来描述数据表结构(id,name字段等)和字段长度等信息 3.后缀名为.ibd的文件:这个文件主要储存的是采用独立表储存模式时储存数据库的数据信息和索引信息; 4.后缀名为.MYD(MYData)的文件:从名字可以看出,这个是存储数据库数据信息的文件,主要是存储采用独立表储存模式时存储的数据信息; 5.后缀名为.MYI的文件:这个文件主要储存的是数据库的索引信息; 6.ibdata1文件:主要作用也是储存数据信息和索引信息,这个文件在mysql安装目录的data文件夹下。 从上面可以看出,.ibd储存的是数据信息和索引信息,ibdata1文件也是存储数据信息和索引信息,.MYD和.MYI也是分别储存数据信息和索引信息,那他们之间有什么区别呢? 主要区别是再于数据库的存储引擎不一样,如果储存引擎采用的是MyISAM,则生成的数据文件为表名.frm、表名.MYD、表名的MYI;而储存引擎如果是innoDB,开启了innodb_file_per_table=1,也就是采用独立储存的模式,生成的文件是表名.frm、表名.ibd,如果采用共存储模式的,数据信息和索引信息都存储在ibdata1(在里面进行分类,从外面看是一个文件)中; 在进行数据恢复的时候,如果用的是MYISAM数据引擎,那么数据很好恢复,只要将相应.frm, .MYD, .MYI文件拷贝过去即可。但是如果是innodb的话,则每一个数据表都是一个单独的文件,只将相应的.frm和.ibd文件拷贝过去是不够的,必须在你的ibd文件的tablespace id和ibdata1文件中的元信息的tablespace id一致才可以。 msyql人家设定的规则就是这样存储表的,使用人家的系统,就要理解人家的规则。
在Oracle 和SQL Server等所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。
Oracle中不存在引擎的概念,数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。