`
purpen
  • 浏览: 785378 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

MySQL数据库存储引擎详解(转)

阅读更多

存储引擎是什么?

  MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。

  例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

  这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

  选择如何存储和检索你的数据的这种灵活性是MySQL为什么如此受欢迎的主要原因。其它数据库系统(包括大多数商业选择)仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用MySQL,我们仅需要修改我们使用的存储引擎就可以了。

  在这篇文章中,我们不准备集中讨论不同的存储引擎的技术方面的问题(尽管我们不可避免地要研究这些因素的某些方面),相反,我们将集中介绍这些不同的引擎分别最适应哪种需求和如何启用不同的存储引擎。为了实现这个目的,在介绍每一个存储引擎的具体情况之前,我们必须要了解一些基本的问题。

如何确定有哪些存储引擎可用

  你可以在MySQL(假设是MySQL服务器4.1.2以上版本)中使用显示引擎的命令得到一个可用引擎的列表。

  1. mysql> show engines;   
  2. +------------+---------+------------------------------------------------------------+   
  3. | Engine     | Support | Comment                                                    |   
  4. +------------+---------+------------------------------------------------------------+   
  5. | MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     |   
  6. | HEAP       | YES     | Alias for MEMORY                                           |   
  7. | MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  |   
  8. | MERGE      | YES     | Collection of identical MyISAM tables                      |   
  9. | MRG_MYISAM | YES     | Alias for MERGE                                            |   
  10. | ISAM       | NO      | Obsolete storage engine, now replaced by MyISAM            |   
  11. | MRG_ISAM   | NO      | Obsolete storage engine, now replaced by MERGE             |   
  12. | InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys |   
  13. | INNOBASE   | YES     | Alias for INNODB                                           |   
  14. | BDB        | NO      | Supports transactions and page-level locking               |   
  15. | BERKELEYDB | NO      | Alias for BDB                                              |   
  16. | NDBCLUSTER | NO      | Clustered, fault-tolerant, memory-based tables             |   
  17. | NDB        | NO      | Alias for NDBCLUSTER                                       |   
  18. | EXAMPLE    | NO      | Example storage engine                                     |   
  19. | ARCHIVE    | NO      | Archive storage engine                                     |   
  20. | CSV        | NO      | CSV storage engine                                         |   
  21. +------------+---------+------------------------------------------------------------+   
  22. 16 rows in set (0.01 sec)  

    这个表格显示了可用的数据库引擎的全部名单以及在当前的数据库服务器中是否支持这些引擎。

 对于MySQL 4.1.2以前版本,可以使用mysql> show variables like "have_%"(显示类似“have_%”的变量):

  1. mysql> show variables like "have_%";    
  2. +------------------+----------+    
  3. | Variable_name    | Value    |    
  4. +------------------+----------+    
  5. | have_bdb         | YES      |    
  6. | have_crypt       | YES      |    
  7. | have_innodb      | DISABLED |    
  8. | have_isam        | YES      |    
  9. | have_raid        | YES      |    
  10. | have_symlink     | YES      |    
  11. | have_openssl     | YES      |    
  12. | have_query_cache | YES      |    
  13. +------------------+----------+    
  14. 8 rows in set (0.01 sec)    

     你可以通过修改设置脚本中的选项来设置在MySQL安装软件中可用的引擎。如果你在使用一个预先包装好的MySQL二进制发布版软件,那么,这个软件就包含了常用的引擎。然而,需要指出的是,如果你要使用某些不常用的引擎,特别是CSV、RCHIVE(存档)和BLACKHOLE(黑洞)引擎,你就需要手工重新编译MySQL源码 。

使用一个指定的存储引擎

  你可以使用很多方法指定一个要使用的存储引擎。最简单的方法是,如果你喜欢一种能满足你的大多数数据库需求的存储引擎,你可以在MySQL设置文件中设置一个默认的引擎类型(使用storage_engine 选项)或者在启动数据库服务器时在命令行后面加上--default-storage-engine或--default-table-type选项 。

  更灵活的方式是在随MySQL服务器发布同时提供的MySQL客户端时指定使用的存储引擎。最直接的方式是在创建表时指定存储引擎的类型,向下面这样:

  CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB

  你还可以改变现有的表使用的存储引擎,用以下语句:

  ALTER TABLE mytable ENGINE = MyISAM

  然而,你在以这种方式修改表格类型的时候需要非常仔细,因为对不支持同样的索引、字段类型或者表大小的一个类型进行修改可能使你丢失数据。如果你指定一个在你的当前的数据库中不存在的一个存储引擎,那么就会创建一个MyISAM(默认的)类型的表.

各存储引擎之间的区别

  为了做出选择哪一个存储引擎的决定,我们首先需要考虑每一个存储引擎提供了哪些不同的核心功能。这种功能使我们能够把不同的存储引擎区别开来。我们一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。一些引擎具有能过促使你做出决定的独特的功能,我们一会儿再仔细研究这些具体问题。

  字段和数据类型

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

  这些局限性可能直接影响到你可以存储的数据,同时也可能会对你实施的搜索的类型或者你对那些信息创建的索引产生间接的影响。这些区别能够影响你的应用程序的性能和功能,因为你必须要根据你要存储的数据类型选择对需要的存储引擎的功能做出决策。

  锁定

  数据库引擎中的锁定功能决定了如何管理信息的访问和更新。当数据库中的一个对象为信息更新锁定了,在更新完成之前,其它处理不能修改这个数据(在某些情况下还不允许读这种数据)。

  锁定不仅影响许多不同的应用程序如何更新数据库中的信息,而且还影响对那个数据的查询。这是因为查询可能要访问正在被修改或者更新的数据。总的来说,这种延迟是很小的。大多数锁定机制主要是为了防止多个处理更新同一个数据。由于向数据中插入信息和更新信息这两种情况都需要锁定,你可以想象,多个应用程序使用同一个数据库可能会有很大的影响。

  不同的存储引擎在不同的对象级别支持锁定,而且这些级别将影响可以同时访问的信息。得到支持的级别有三种:表锁定、块锁定和行锁定。支持最多的是表锁定,这种锁定是在MyISAM中提供的。在数据更新时,它锁定了整个表。这就防止了许多应用程序同时更新一个具体的表。这对应用很多的多用户数据库有很大的影响,因为它延迟了更新的过程。

  页级锁定使用Berkeley DB引擎,并且根据上载的信息页(8KB)锁定数据。当在数据库的很多地方进行更新的时候,这种锁定不会出现什么问题。但是,由于增加几行信息就要锁定数据结构的最后8KB,当需要增加大量的行,也别是大量的小型数据,就会带来问题。

  行级锁定提供了最佳的并行访问功能,一个表中只有一行数据被锁定。这就意味着很多应用程序能够更新同一个表中的不同行的数据,而不会引起锁定的问题。只有InnoDB存储引擎支持行级锁定。

  建立索引

  建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能。不同的存储引擎提供不同的制作索引的技术。有些技术也许会更适合你存储的数据类型。

  有些存储引擎根本就不支持索引,其原因可能是它们使用基本表索引(如MERGE引擎)或者是因为数据存储的方式不允许索引(例如FEDERATED或者BLACKHOLE引擎)。

  事务处理

  事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括对借方科目和贷方科目数据的更改,你需要要使用事务处理功能保证对借方科目和贷方科目的数据更改都顺利完成,才接受所做的修改。如果任一项操作失败了,你都可以取消这个事务处理,这些修改就不存在了。如果这个事务处理过程完成了,我们可以通过允许这个修改来确认这个操作。

  至此为止,我们介绍了MySQL存储引擎的相关基本概念,在下一篇文章里,我们会分别介绍各种MySQL存储引擎。

分享到:
评论

相关推荐

    MYSQL数据库 存储过程详解.xmind

    MYSQL数据库存储过程章节内容详解,思维导图

    mysql-数据库实验二-详解及答案.docx

    mysql-数据库实验二-详解及答案.docx

    mysql数据库详解.pdf

    数据库基于存储介质的不同进行了分类:关系型数据库(SQL)和非关系型数据库 (NoSQL:Not Only SQL)。 3、不同的数据库阵营中的产品有哪些? 大型:Oracle、DB2 中型:SQL-SERVER、MySQl 小型:access等 关系型...

    MySQL数据库DBA管理员基石演练课程 MySQL管理员必备的基础与实战基础 MySQL实战教程

    MySQL数据库DBA管理员基石演练课程由一线的数据库大牛亲自操刀,打造一次关于MySQL数据库的基础学习与运维实战课程。完成课程的学习可以帮助同学们快速掌握和入门MySQL数据库,并能够快速建立起对数据库世界的认知。...

    MySQL数据库运维视频教程.zip

    MySQL数据库运维--第1周.mp4 1.机器选型&系统规划.ppt MySQL数据库运维--第2周.mp4 2.安装部署.ppt MySQL数据库运维文案--第3周.mp4&doc 3.压力测试.ppt MySQL数据库运维文案--第4周.mp4 4.性能优化.ppt MySQL数据库...

    mysql架构设计与InnoDB存储引擎详解

    mysql架构设计与InnoDB存储引擎详解

    Mysql数据库从入门到精通.rar

    1.mysql 备份数据 2.Mysql 更新数据 ...10.浅谈MySQL存储引擎选择InnoDB还是MyISAM 11.浅谈unique列上插入重复值的MySQL解决方案 12.深入了解MySQL 5.5分区功能增强.doc 13.在MySQL中操作日期和时间

    MySQL数据库开发教程-基础概念、SQL语法和Node.js操作详解

    - 最后给出了Node.js操作MySQL数据库的代码示例。 适用人群: - 需要使用关系型数据库的软件开发人员 - 要学习MySQL数据库相关知识的学生或 enthusiast 使用场景: - 需要持久化存储和管理结构化数据的软件系统 ...

    Mysql数据库应用部署及Sql操作

    一、数据库的概述; 二、数据库的分类; 三、Mysql的概述: 四、Mysql存储原理: 五、案例:centos 7搭建Mysql 5.7; 六、Sql语句操作之增删改查;...九、Mysql存储引擎的应用; 十、Mysql配置文件详解

    Mysql存储引擎详解

    因为在关系型数据库中数据的存储是以表的形式存储 的,所以存储引擎也可以称为表类型(即存储和操作此表的类型) Mysql中的存储引擎 MyISAM 这种引擎是mysql最早提供的,这种引擎又可以分为静态MyISAM、动态M

    MySQL如何更改数据库数据存储目录详解

    1:确认MySQL数据库存储目录 [root@DB-Server tmp]# mysqladmin -u root -p variables | grep datadir Enter password: | datadir | /var/lib/mysql/ 2:关闭MySQL服务 在更改MySQL的数据目录前,必须关闭MySQL...

    Mysql数据库索引创建、索引删除、索引失效场景详解

    在关系数据库中,索引是一种单独对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的...在MySQL数据库一共支持5种类型的索引和9种索引失效的场景,下面,我来进行一一介绍。

    MySQL逻辑架构-存储引擎-用户权限密码详解

    MySQL逻辑架构-存储引擎-用户权限密码详解 • mysql系统架构 • 常见引擎 • msyql 数据库用户和权限管理 • 修改帐户密码 • 重置root密码

    MySQL性能优化详解

    MySQL是目前使用最多的开源数据库,但是MySQL数据库的默认设置性能非常的差,仅仅是一个玩具数据库。...优化是一个复杂的任务,本文描述MySQL相关的数据库设计和查询优化,服务器端优化,存储引擎优化。

    Python3爬虫学习之MySQL数据库存储爬取的信息详解

    本文实例讲述了Python3爬虫学习之MySQL数据库存储爬取的信息。分享给大家供大家参考,具体如下: 数据库存储爬取的信息(MySQL) 爬取到的数据为了更好地进行分析利用,而之前将爬取得数据存放在txt文件中后期处理...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    12-为什么选择MySQL数据库即MySQL优势介绍.avi 13-MySQL数据库分类与版本升级知识讲解.avi 14-MySQL数据库商业版与社区版区别.avi 15-MySQL数据库的发布版本知识讲解.avi 16-MySQL数据库发展的三条产品线介绍.avi 17...

    mysql存储过程实例详解,pdf

    mysql存储过程实例详解

    Mysql InnoDB引擎的索引与存储结构详解

    而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。 MySQL主要存储引擎的区别 MySQL默认的存储引擎是MyISAM,其他常用的就是...

    MYSQL数据库表结构优化方法详解

    本文实例讲述了MYSQL数据库表结构优化方法。分享给大家供大家参考,具体如下:  选择合适的数据类型  1、使用可以存下你的数据的最小的数据类型  2、使用简单的数据类型。Int要比varchar类型在mysql处理上简单 ...

Global site tag (gtag.js) - Google Analytics