MySQL--数据库存储引擎(主要分析对⽐InnoDB和MyISAM以
及讲述Mrg_Myi。。。
⼀、存储引擎的概述:
基于此博客去扩展,不过每个我都会⽤例⼦去验证,并写出的见解。
(1)为什么要合理选择数据库存储引擎:
MySQL中的数据⽤各种不同的技术存储在⽂件(或者内存)中。这些技术中的每⼀种技术都使⽤不同的存储机制、索引技巧、锁定⽔平并且最终提供⼴泛的不同的功能和能⼒。通过选择不同的技术,你能够获得额外的速度或者功能,从⽽改善你的应⽤的整体功能。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启⽤。你可以选择适⽤于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最⼤的灵活性。
(2)定义:
数据库引擎是⽤于存储、处理和保护数据的核⼼服务。利⽤数据库引擎可控制访问权限并快速处理事务,从⽽满⾜企业内⼤多数需要处理⼤量数据的应⽤程序的要求。使⽤数据库引擎创建⽤于联机事务处理或联机分析处理数据的关系数据库。这包括创建⽤于存储数据的表和⽤于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
(3)存储引擎作⽤:
1)设计并创建数据库以保存系统所需的关系或XML⽂档。
2)实现系统以访问和更改数据库中存储的数据。包括实现⽹站或使⽤数据的应⽤程序,还包括⽣成使⽤SQL Server⼯具和实⽤⼯具以使⽤数据的过程。
3)为单位或客户部署实现的系统。
4)提供⽇常管理⽀持以优化数据库的性能。
(4)如何修改数据库引擎:
⽅式⼀:
修改配置⽂件my.ini
将mysql.ini另存为my.ini,在[mysqld]后⾯添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB
⽅式⼆:
在建表的时候指定
create table mytbl(
id int primary key,
name varchar(50)
)type=MyISAM;
⽅式三:
建表后更改
alter table table_name type = InnoDB;
(5)怎么查看修改成功?
⽅式⼀:
java老师招聘⽅式⼆:
⽅式三:
使⽤数据库管理⼯具啊。
⼆、MySQL 各⼤存储引擎:
最好先看下你下的MySQL
⽀持什么数据库引擎
存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Blackhole, 5. CSV, 6. Performance_Schema, 7.Archive, 8. Federated , 9 Mrg_Myisam
但是我们主要分析使⽤MyIsam 和InnoDB 。其余略微带过,详情请分别百度。
(1)InnoDB :
定义:(默认的存储引擎)
InnoDB 是⼀个事务型的存储引擎,有⾏级锁定和外键约束。
Innodb 引擎提供了对数据库ACID 事务的⽀持,并且实现了SQL 标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这类型的⽂章。该引擎还提供了⾏级锁和外键约束,它的设计⽬标是处理⼤容量数据库系统,它本⾝其实就是基于MySQL 后台的完整数据库系统,MySQL 运⾏时Innodb 会在内存中建⽴缓冲池,⽤于缓冲数据和索引。但是该引擎不⽀持
FULLTEXT 类型的索引,⽽且它没有保存表的⾏数,当SELECT COUNT(*) FROM TABLE 时需要扫描全表。当需要使⽤数据库事务时,该引擎当然是⾸选。由于锁的粒度更⼩,写操作不会锁定全表,所以在并发较⾼时,使⽤Innodb 引擎会提升效率。但是使⽤⾏级锁也不是绝对的,如果在执⾏⼀个SQL 语句时MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表。show table status from table_
name;
show create table table_name
//这个就是select锁表的⼀种,不明确主键。增删改查都可能会导致锁全表,在以后我们会详细列出。
SELECT * FROM products WHERE name='Mouse' FOR UPDATE;
适⽤场景:
1)经常更新的表,适合处理多重并发的更新请求。
2)⽀持事务。
3)可以从灾难中恢复(通过bin-log⽇志等)。
4)外键约束。只有他⽀持外键。
5)⽀持⾃动增加列属性auto_increment。
MySQL官⽅对InnoDB的讲解:
1)InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能⼒的事务安全(ACID兼容)存储引擎。
2)InnoDB锁定在⾏级并且也在SELECT语句提供⼀个Oracle风格⼀致的⾮锁定读,这些特⾊增加了多⽤户部署和性能。没有在InnoDB中扩⼤锁定的需要,因为在InnoDB中⾏级锁定适合⾮常⼩的空间。
3)InnoDB也⽀持FOREIGN KEY强制。在SQL查询中,你可以⾃由地将InnoDB类型的表与其它MySQL 的表的类型混合起来,甚⾄在同⼀个查询中也可以混合。
4)InnoDB是为处理巨⼤数据量时的最⼤性能设计,它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
5) InnoDB被⽤来在众多需要⾼性能的⼤型数据库站点上产⽣。
补充:什么叫事务?简称ACID
A 事务的原⼦性(Atomicity):指⼀个事务要么全部执⾏,要么不执⾏.也就是说⼀个事务不可能只执⾏了⼀半就停⽌了.⽐如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,⽽钱却没出来.这两步必须同时完成.要么就不完成.
C 事务的⼀致性(Consistency):指事务的运⾏并不改变数据库中数据的⼀致性.例如,完整性约束了
a+b=10,⼀个事务改变了a,那么b也应该随之改变.
I 独⽴性(Isolation):事务的独⽴性也有称作隔离性,是指两个以上的事务不会出现交错执⾏的状态.因为这样可能会导致数据不⼀致.
D 持久性(Durability):事务的持久性是指事务执⾏成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会⽆缘⽆故的回滚.
(2)MyIsam:
定义:
MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的⽀持,也不⽀持⾏级锁和外键,因此当INSERT(插⼊)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低⼀些。
MyIsam 存储引擎独⽴于操作系统,也就是可以在windows上使⽤,也可以⽐较简单的将数据转移到linux操作系统上去。
意味着:引擎在创建表的时候,会创建三个⽂件,⼀个是.frm⽂件⽤于存储表的定义,⼀个是.MYD⽂件⽤于存储表的数据,另⼀个是.MYI⽂件,存储的是索引。操作系统对⼤⽂件的操作是⽐较慢的,这mysql是什么系统
样将表分为三个⽂件,那么.MYD这个⽂件单独来存放数据⾃然可以优化数据库的查询等操作。有索引管理和字段管理。MyISAM还使⽤⼀种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运⾏OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。
适⽤场景:
1)不⽀持事务的设计,但是并不代表着有事务操作的项⽬不能⽤MyIsam存储引擎,可以在service层进⾏根据⾃⼰的业务需求进⾏相应的控制。
2)不⽀持外键的表设计。
3)查询速度很快,如果数据库insert和update的操作⽐较多的话⽐较适⽤。
css制作网页代码4)整天对表进⾏加锁的场景。
5)MyISAM极度强调快速读取操作。
6)MyIASM中存储了表的⾏数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值⽽不需要进⾏全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的⽀持,那么MyIASM 也是很好的选择。
缺点:
就是不能在表损坏后恢复数据。(是不能主动恢复)
补充:ISAM索引⽅法–索引顺序存取⽅法
定义:
是⼀个定义明确且历经时间考验的数据表格管理⽅法,它在设计之时就考虑到数据库被查询的次数要远⼤于更新的次数。
特性:
ISAM执⾏读取操作的速度很快,⽽且不占⽤⼤量的内存和存储资源。
在设计之初就预想数据组织成有固定长度的记录,按顺序存储的。—ISAM是⼀种静态索引结构。
缺点:
1.它不⽀持事务处理
2.也不能够容错。如果你的硬盘崩溃了,那么数据⽂件就⽆法恢复了。如果你正在把ISAM⽤在关键任务应⽤程序⾥,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够⽀持这样的备份应⽤程序。
(3)Memory(也叫HEAP)堆内存嘛:
定义:
使⽤存在内存中的内容来创建表。每个MEMORY表只实际对应⼀个磁盘⽂件。MEMORY类型的表访问⾮常得快,因为它的数据是放在内存中的,并且默认使⽤HASH索引。
但是⼀旦服务关闭,表中的数据就会丢失掉。 HEAP允许只驻留在内存⾥的临时表格。驻留在内存⾥让HEAP要⽐ISAM和MYISAM 都快,但是它所管理的数据是不稳定的,⽽且如果在关机之前没有进⾏保存,那么所有的数据都会丢失。在数据⾏被删除的时
候,HEAP也不会浪费⼤量的空间。HEAP表格在你需要使⽤SELECT表达式来选择和操控数据的时候⾮常有⽤。
适⽤场景:
1)那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于⾼效地堆中间结果进⾏分析并得到最终的统计结果。
2)⽬标数据⽐较⼩,⽽且⾮常频繁的进⾏访问,在内存中存放数据,如果太⼤的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的⼤⼩,限制Memory表的最⼤的⼤⼩。
3)数据是临时的,⽽且必须⽴即可⽤得到,那么就可以放在内存中。
4)存储在Memory表中的数据如果突然间丢失的话也没有太⼤的关系。
注意: Memory同时⽀持散列索引和B树索引,B树索引可以使⽤部分查询和通配查询,也可以使⽤<,>和>=等操作符⽅便数据挖掘,散列索引相等的⽐较快但是对于范围的⽐较慢很多。
特性要求:
1)要求存储的数据是数据长度不变的格式,⽐如,Blob和Text类型的数据不可⽤(长度不固定的)。2)要记住,在⽤完表格之后就删除表格。
path的用法和搭配(4)Mrg_Myisam:(分表的⼀种⽅式–⽔平分表)
定义:
是⼀个相同的可以被当作⼀个来⽤的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。
也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam 引擎的表中,但是可以直接进⾏查询、删除更新等操作。
⽐如:我们可能会遇到这样的问题,同⼀种类的数据会根据数据的时间分为多个表,如果这时候进⾏查询的话,就会⽐较⿇烦,Merge可以直接将多个表聚合成⼀个表统⼀查询,然后再删除Merge表(删除的是定义),原来的数据不会影响。
(5)Blackhole(⿊洞引擎)
定义
任何写⼊到此引擎的数据均会被丢弃掉,不做实际存储;Select语句的内容永远是空。巴啦啦小魔仙演员表全部
他会丢弃所有的插⼊的数据,服务器会记录下Blackhole表的⽇志,所以可以⽤于复制数据到备份数据库。
使⽤场景:
1)验证dump file语法的正确性
2)以使⽤blackhole引擎来检测binlog功能所需要的额外负载
3)充当⽇志服务器
其余引擎,⼤家感兴趣就各⾃先百度吧。本⽂主要是对⽐引擎使⽤以及其原理。
三、InnoDB和MyIsam使⽤及其原理对⽐:
(1)使⽤的效果与区别展⽰:
(⼀)在⼀个普通数据库中创建两张分别以MyIsam和InnoDB作为存储引擎的表。
create table testMyIsam(
id int unsigned primary key auto_increment,
name varchar(20) not null
)engine=myisam;
黑马培训班多少钱一期create table testInnoDB(
id int unsigned primary key auto_increment,
name varchar(20) not null
)engine=innodb;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论