您的位置:首页 > 数据库 > MySQL

Mysql存储引擎

2013-09-08 14:53 190 查看
存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

Mysql的数据库工作结结果:mysql是插件式存储引擎,在服务器级别,可以在任何时候装载和移除一个存储引擎,而且不用重启服务器,
对mysql而言他的简要工作架构:首先是前端等待用户请求的称为连接管理器,而后如果用户请求在缓存中有内容,就直接从缓存返回结果,如果缓存没有,就交给分析器,分析器分析结束后,仍然有可能会发现缓存被命中,否则如果没有命中,分析器要生成执行树,要预处理,再生成执行树,最后交给优化器进行优化,优化器优化后将选择好的执行路径提交给执行引擎,执行引擎通过API真正的提交给 存储引擎负责执行存储引擎负责将mysql的逻辑结构转换成物理结构,
查看服务器支持哪些种存储引擎:mysql> SHOW ENGINES;




显示Suppert这列显示为DEFAULT的想表示为默认存储引擎,默认是Innodb
MyISAM和InnDB区别:最重要的是InnoDB支持事务,而MyISAM不支持,InnDB支持的是行级锁,MyISAM支持的是表级锁
存储引擎是表级别的概念;所以创建表时可以使用ENGING的表选项来指定存储引擎,所以在同一个库内,可以混合使用多种存储引擎;所以存储引擎也叫表类型;

要想查看某张表使用了什么存储引擎,使用指令:
mysql>SHOW TABLE STATUS 显示一个库内所有标的存储引擎的类型
mysql的表都是MyISAM存储引擎;




表的状态信息有:
Engine:存储引擎;Version:版本;Roe_format:行格式Rows:表中已有的行数:对MyISAM表而言,这个值是精确的,但对InnoDB或其他事物型的表来讲这个值是估算的,应为MyISAM是立即写入数据的,InnoDB是先要写入事物日志,而后在同步到数据当中的,所以它只能估算;Avg_row_length:平均的行长度,单位是字节;Data_length:表的数据大小,当前表内一共有多少数据;单位字节Max_data_length:表的最大存储空间,单位是字节,但这个值跟存储引擎有关系,不同的存储引擎以及不同的mysql服务器他们所能够表示的最大上限是不相同的,Index_length:索引长度,Data_free:对MyISAM来讲,表示已分配,但目前尚未使用的空间;通常好似表示此前已被存储的行,后又被删除后,行中间会产生空隙,可以被插入新的行,可以继续使用;Auto_increment:具有自动增长属性的字段,下一个自动增长的值;一个表中只能有一个Auto_increment;显示为NULL表示这里没有自动增长的字段;Create_time:表的创建时间;Updata_time:更新时间,数据的最后修改时间,Check_time:使用CHECK命令最近一次检查表的时间;myisamchk;Collation:排序规则;Checksum:表的校验和;这个功能启用了后才会创建值的;Create_options:创建表时指定的其它选项;Comment:注释;对于MyISAM表,存储的是创建表时的comment表选项指定的信息;对InnoDB表来讲,存储对应的表空间剩余的表空间信息;

对MyISM而言行格式有:Dynamic:表示使用的是varch、varbalery的行;Fixed:定长结果;Compressed:行是被压缩以后存放的;compact:这是在表当中存储表的时候的存储格式

存储引擎种类




InnoDB:
支持事务:事务日志
支持外键:这是mysql中唯一一个支持外键的;
他是利用MVCC实现多版本并发控制
支持聚簇索引:数据跟索引是存储在一起的,按主索引存储,索引它也是顺序文件,或有序顺序文件;但MyISAM不支持索引,所以MyISAM称为堆文件;
支持间隙锁,能够有效的防止幻读的出现,这些都可以调整,通过InnoDB的服务器参数或叫服务器变量调整;
支持二级索引,支持辅助索引,除了主索引外,可以创建多个索引,但是都是通过主索引来检索数据的,索引主索引效率必须非常高,
另外InnoDB在必要时还支持自适应hash索引;还支持加速插入操作的插入数据缓冲区,
支持热备:需要特殊工具:MySQL需要 Enterprise Backup,或Percona Xtrabackup
行级锁,在行级锁级别还支持间隙锁;支持4个标准的隔离级别;
InnoDB引擎存储数据的时候,表格式是单独存储的,但数据和所以是存储在一起放在表空间当中的;默认情况下mysql是将所以数据库的InnoDB表都放在同一个表空间里,这种方式管理起来非常麻烦,而且不支持各种高级功能,建议每个表使用一个存储空间。

存储:
存储为tbname.frm的表格式
存储为tbname.ibd 的表空间
要想开启单表一个表的功能需要一个服务器变量,这个变量是:innodb_file_per_tableMyISAM:不支持事务,

支持全文索引,可以索引到某个字段上的所有数据上,
支持数据压缩存放
支持空间索引,在空间索引上要想空间查询一般要使用空间函数;
表级锁
延迟更新索引键
MyISAM有纵多缺陷:
不支持事务和行级锁
崩溃后无法安全恢复
只读数据(数据仓库)、较小的表、能够忍受修复操作

MyISAM存储:
tbname.frm
tbname.MYD
tbname.MYI
ARCHIVE:
仅支持INSERT和SELECT,不支持更新不支持删除,甚至不支持索引,只支持插入和查询,但支持很好的压缩功能;通常是用来实现数据仓库的
适用于存储日志信息,或其它按时间序列实现的数据采集类应用;
SELECT作用:查询某一阶段内的所有数据,并生成一个报表,
CSV:
将数据保存为CSV格式;不支持索引;仅适用数据交换;

BLACKHOLE:
没有存储机制,任何数据都会被丢弃,但是会记录二进制日志;
FEDERATED:

访问远程服务器上数据的存储引擎默认都是禁用的,FederatedX
MEMORY:

内存存储引擎,比MyISAM至少快一个数量级; 通常用于实现临时表;
MRG_MYISAM:

合并多个MyISAM表的存储引擎;
NDB:专用于MySQL Cluster;

第三方存储引擎:

OLTP类:
XtraDB
PBXT
TokuDB:支持分形树索引结构;
列式存储引擎:

Infobright:
InfiniDB:
MonetDB:
LucidDB:
社区存储引擎:

Aria
Groona:全文索引引擎
QQGraph:支持图, 由Open query研发
SphinxSE:
Spider:支持分片(shard)
VPForMySQL:支持垂直分区
每一种存储引擎在启用之后,都有可能引入很多服务器变量和服务器状态变量,

选择存储引擎标准:一般的MyISAM只要存储数量比较大上GB甚至1十几个GB时,就尽量不要考虑MyISAM,或者可以意识到将来数量会增大的时候,就直接使用InnoDB;

一般选择是要先考虑一下3个标准:
事务:是否需要事务,对方是否支持事务备份:是否需要支持热备,
崩溃恢复:数据库崩溃之后能不能接受手动恢复,需要多长时间恢复;

注:如果要存储日志的话MyISAM和ARCHIVE都比较适用,存储那些按时间增长的数据MyISAM和ARCHIVE也都适用, 如果要存储的是像论坛之类的程序,这种一般适用InnoDB,订单处理的也使用InnoDB,数据量大的使用Infobright或者Nosql。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Mysql存储引擎