简单说,当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件。以关系型数据库为例,你发SQL语句给数据库引擎,数据库引擎解释SQL语句,提取出你需要的数据返回给你。因此,对访问者来说,数据库引擎就是SQL语句的解释器。


mysql的体系结构
mysql由 管理服务和工具组件、连接池组件、sql接口组建、查询分析器组件、优化器组件、缓存组件、插件式存储引擎、物理文件。




一、什么是存储引擎?
MySQL中的数据用各种不同的技术存储在文件(或者内存)中,这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的相关功能在MySQL中称为存储引擎(也称为表类型)。

MySql支持多个存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎:
  1、ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。

  2、MyISAM管理非事务表,是ISAM的扩展格式。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。它提供高速存储和检索,以及全文搜索能力,受到web开发的青睐。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎。

  3、MEMORY存储引擎提供“内存中”表,被正式确定为HEAP引擎,也处理非事务表。HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。

  4、InnoDB和BDB(BerkleyDB)存储引擎提供事务安全表。尽管要比ISAM和MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外键的支持,这两点都是前两个引擎所没有的。

  5、NDB Cluster是被MySQLCluster用来实现分割到多台计算机上的表的存储引擎,当前只被Linux, Solaris和Mac OS X支持。



二、如何更换引擎?
  1、Globle:一种最简单的方法就是更改服务器配置,直接将其设置成你所需要的引擎。这个在win下通过更改服务器安装目录下的mysql.ini或my.ini中的default-storage-engine项即可,也可以通过运行MySQL ServerInstance Configuration Wizard做简单的设置。

  2、PerTable:除了全局的方法外,还有一种更灵活的配置方法,那就是按表来设置引擎,这样我们就可以把那些需要用到事务处理的表设置成InnoDB,其他设置成MyISAM,将性能提升到极致,设置方法也比较简单:
  创建一个新表时,可以通过在CREATE语句中ENGINE或TYPE选项来告诉MySQL要创建什么类型的表:
  CREATE TABLE t (i INT) ENGINE = INNODB;
  CREATE TABLE t (i INT) TYPE = MEMORY;
  如果省略掉ENGINE或TYPE选项,默认的存储引擎被使用。当MySQL被用MySQL配置向导安装在Windows平台上,InnoDB存储引擎替代MyISAM存储引擎作为默认。当不可用的类型被指定时,自动用InnoDB表来替代。

  3、还可以把表从一个类型转到另一个类型,使用ALTERTABLE语句:
  ALTER TABLE t ENGINE = MYISAM;
  ALTER TABLE t TYPE = BDB;
  当不清楚当前数据库中各表的引擎时可以使用SHOW TABLE STATUS FROMDBname来查看。



三、如何选择存储引擎?
关于这个问题,我们需要考虑每个存储引擎提供了哪些不同的核心功能,一般把这些核心功能分为4类:支持的字段和数据类型、锁定类型、索引和事务处理。

1、支持的字段和数据类型
虽然所有这些引擎都支持通用的数据类型,例如整型、实型和字符型等,但是,并不是所有的引擎都支持其它的字段类型,特别是BLOG(二进制大对象)或者TEXT文本类型。

2、锁定类型
锁定机制主要是为了防止多个处理同时更新同一个数据。不同的存储引擎支持不同级别的锁定:表锁定、页锁定和行锁定。
  表锁定:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。支持最多的就是表锁定,MyISAM和MEMORY支持这种锁定。MySQL的表级锁有两种模式:表共享读锁和表独占写锁。对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作;MyISAM表的读操作与写操作之间,以及写操作之间是串行的!
  行锁定:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。InnoDB表进行行级锁定。
  页锁定:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。BerkeleyDB引擎支持页锁定。

3、索引
建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些存储引擎根本不支持索引。

4、事务处理
事务处理功能通过提供在向表中更新和插入信息期间的可靠性。



更多相关文章

  1. PHP数据库类的封装
  2. python pymysql连接数据库pymysql.err.OperationalError 1044
  3. 将MySQL用于OUTFILE以生成Excel可读的UTF8数据
  4. 程序猿(媛)Shell脚本必备技能之一: 在Linux下如何自动备份mysql
  5. ThinkPHP2.1 读取SqlServer数据(并解决SqlServer中DateTime显示问
  6. mysql数据版本控制系统的最佳实践
  7. Log4j2记录日志到数据库(MySQL&MongoDB)
  8. MySql查询随机几条数据
  9. MySQL数据库总结(8)字符集与校对集

随机推荐

  1. 最近总结的android疑惑
  2. android中怎么把控件隐藏
  3. Android 自定义搜索Searchable
  4. Android快速上手
  5. Android Selector 与 Shape 基本用法
  6. Android新增AppCompatTextView自适应字体
  7. Android:控件的隐藏显示失效了
  8. cc
  9. 近百android程序源码贡献
  10. Android(安卓)xml 中@和问号?等解释