`
fred2005
  • 浏览: 26821 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

MySql table 存储引擎

阅读更多
存储引擎是什么?

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

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

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

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

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

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

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

mysql> show engines;

+------------+---------+----------------------------------------------------------
| Engine     | Support | Comment                                                   
+------------+---------+----------------------------------------------------------| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance    
| HEAP       | YES     | Alias for MEMORY                                           | MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | MERGE      | YES     | Collection of identical MyISAM tables                      | MRG_MYISAM | YES     | Alias for MERGE                                            | ISAM       | NO      | Obsolete storage engine, now replaced by MyISAM           
| MRG_ISAM   | NO      | Obsolete storage engine, now replaced by MERGE            
| InnoDB     | YES     | Supports transactions, row-level locking,and foreign keys
| INNOBASE   | YES     | Alias for INNODB                                      
| BDB        | NO      | Supports transactions and page-level locking          
| BERKELEYDB | NO      | Alias for BDB                                         
| NDBCLUSTER | NO      | Clustered, fault-tolerant, memory-based tables     
| NDB        | NO      | Alias for NDBCLUSTER                                   
| EXAMPLE    | NO      | Example storage engine                                  
| ARCHIVE    | NO      | Archive storage engine                                  
| CSV        | NO      | CSV storage engine                                    
+------------+---------+---------------------------------------------------------+

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

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

mysql> show variables like "have_%";

+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| have_bdb         | YES      |
| have_crypt       | YES      |
| have_innodb      | DISABLED |
| have_isam        | YES      |
| have_raid        | YES      |
| have_symlink     | YES      |
| have_openssl     | YES      |
| have_query_cache | YES      |
+------------------+----------+

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引擎)。

事务处理
事务处理功能通过提供在向表中更新和插入信息期间的可靠性。这种可靠性是通过如下方法实现的,它允许你更新表中的数据,但仅当应用的应用程序的所有相关操作完全完成后才接受你对表的更改。例如,在会计处理中每一笔会计分录处理将包括

MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的 顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚,不具有原子性。如果执行大量 的SELECT,MyISAM是更好的选择。

InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,

对于支持事物的InnoDB类型的标,影响速度的主要原因是AUTOCOMMIT默认设置是打开的,而且程序没有显式调用BEGIN 开始事务,导致每插入一条都自动Commit,严重影响了速度。可以在执行sql前调用begin,多条sql形成一个事物(即使autocommit打 开也可以),将大大提高性能。

===============================================================
1. 4.0以上mysqld都支持事务,包括非max版本。3.23的需要max版本mysqld才能支持事务。

2. 创建表时如果不指定type则默认为myisam,不支持事务。
可以用 show create table tablename 命令看表的类型。

2.1 对不支持事务的表做start/commit操作没有任何效果,在执行commit前已经提交,测试:
执行一个msyql:
use test;
drop table if exists tn;
create table tn (a varchar(10)) type=myisam;
drop table if exists ty;
create table ty (a varchar(10)) type=innodb;

begin;
insert into tn values('a');
insert into ty values('a');
select * from tn;
select * from ty;
都能看到一条记录

执行另一个mysql:
use test;
select * from tn;
select * from ty;
只有tn能看到一条记录
然后在另一边
commit;
才都能看到记录。

3. 可以执行以下命令来切换非事务表到事务(数据不会丢失),innodb表比myisam表更安全:
   alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name
但可以用check table,以及mysqlcheck [OPTIONS] database [tables]

4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务(
只影响到create语句。)
--default-table-type=InnoDB

测试命令:
use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;

5. 临时改变默认表类型可以用:
set table_type=InnoDB;
show variables like 'table_type';
或:
c:\mysql\bin\mysqld-max-nt --standalone --default-table-type=InnoDB


分享到:
评论

相关推荐

    mysql-存储引擎-实验四.docx

    在 MySQL 中,可以使用 ALTER TABLE 语句将表的存储引擎修改为其他类型。 4. 建立学生表,学号 3188909101 开始自动增长。 在实验中,我们建立了一个学生表,并使用自动增长列设置学号的初始值为 3188909101。在 ...

    mysql存储引擎介绍

    MySQL 存储引擎详解 MySQL 存储引擎是 MySQL 数据库管理系统中的一种机制,用于管理和存储数据。 MySQL 提供了多种存储引擎,每种引擎都有其特点和优缺。了解 MySQL 存储引擎的特点和优缺是非常重要的,因为它们...

    MySQL课程之MySQL存储引擎入门

    MySQL是世界上最流行的关系型数据库管理系统之一,其强大的功能和灵活性主要得益于它支持多种存储引擎。在MySQL课程中,深入理解存储引擎是至关重要的,因为不同的存储引擎有着不同的特性和适用场景,这直接影响到...

    MySQL存储引擎解析.doc

    MySQL存储引擎是数据库管理系统的核心组成部分,负责数据的存储和访问方式。MySQL系统由多个组件构成,包括管理工具、连接池、SQL接口、分析器、优化器、缓存、存储引擎和硬盘。其中,存储引擎是专门处理表数据的...

    MySQL之存储引擎

    MySQL存储引擎是数据库管理系统的核心组件,它决定了数据如何在硬盘上存储、检索以及处理事务。MySQL支持多种存储引擎,每种引擎都有其特定的优势和适用场景。以下是对几个主要存储引擎的详细介绍: 1. **MyISAM**...

    MySql的存储引擎.doc

    它的核心特性之一就是插入式的多存储引擎机制,这使得MySQL能够根据不同的应用场景选择最适合的存储方式。 存储引擎是数据库管理系统中负责数据存储、索引创建、数据更新和查询等操作的具体实现方式。MySQL支持多种...

    mysql存储与索引技术

    MySQL 数据库是一个广泛使用的开源关系型数据库管理系统,其性能很大程度上取决于存储引擎和索引的选取与使用。本文将深入探讨 MySQL 中的存储引擎和索引技术,帮助优化数据库性能。 首先,MySQL 提供了多种存储...

    mysql 存储引擎1

    MySQL数据库系统支持多种存储引擎,每种引擎都有其特定的功能和优化目标,使得用户可以根据具体的应用场景选择最适合的引擎。本篇文章将详细探讨两种最常用的存储引擎——InnoDB和MYISAM,以及如何在MySQL中查看这两...

    深入解析:MySQL存储引擎的奥秘

    在MySQL中,可以通过执行`ALTER TABLE`语句来更改表的存储引擎。例如,将`Employees`表的存储引擎从InnoDB转换为MyISAM的命令如下: ```sql ALTER TABLE Employees ENGINE = MyISAM; ``` #### 八、总结 通过本文...

    MySQL存储引擎配置与SQL查询

    ### MySQL存储引擎配置与SQL查询 #### 一、MySQL存储引擎的配置 在MySQL数据库管理系统中,存储引擎是用于组织和管理数据的方式。不同的存储引擎提供了不同的特性,例如事务处理能力、索引类型等。因此,了解如何...

    探索MySQL的心脏:如何查看当前存储引擎

    ### 探索 MySQL 的心脏:如何查看当前存储引擎 MySQL 是一个非常强大的开源关系型数据库管理系统(RDBMS),在 Web 应用程序的后端数据存储领域占据着举足轻重的地位。它以结构化查询语言(SQL)为基础,是 LAMP...

    【MySQL】存储引擎(六).pdf

    ### MySQL存储引擎详解 #### 一、存储引擎概述 存储引擎是MySQL数据库系统的一个核心概念,它是处理数据存储和检索的软件模块。简单来说,存储引擎决定了如何存储数据、如何检索数据以及如何处理数据的不同特性。...

    MySQLMerge存储引擎

    MySQLMerge存储引擎是一种特殊的存储引擎,它允许将多个MyISAM表组合成一个逻辑上的大表,以便于管理和查询。这种引擎的主要目的是为了提供一种高效的方式来处理大量的分年度或分时间段的数据,例如日志记录或其他...

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

    存储引擎层位于最下层,负责MySQL中的数据存储和提取,支持事务处理,不同存储引擎有其特定的功能和特性。 在存储引擎层,常见引擎包括MYISAM和InnoDB。MYISAM引擎不支持事务处理,但执行速度较快,适合用于只读或...

    基于MySQL的存储引擎与日志说明(全面讲解)

    查询特定表的存储引擎,可以通过`SHOW CREATE TABLE`、`SHOW TABLE STATUS`或查询`INFORMATION_SCHEMA.TABLES`表来实现。 总结来说,MySQL的存储引擎和日志系统是其高效、可靠运行的基础。选择合适的存储引擎和正确...

    编写一个简单的mysql存储引擎1

    在MySQL中,自定义存储引擎是一项高级任务,它允许开发者扩展数据库的核心功能,以满足特定需求。本例中,我们将探讨如何基于MySQL提供的ha_example存储引擎样例来创建一个新的存储引擎——cedb。 首先,ha_example...

    MySQL数据库:存储引擎深入解析

    ### MySQL数据库:存储引擎深入解析 #### 一、存储引擎概念与重要性 **存储引擎**,也称为**表类型**,是MySQL数据库系统中负责数据的存储与检索的核心组件。每种存储引擎都拥有自己独特的优势和局限性,比如支持...

    MySQL+InnoDB存储引擎的一些参数.doc

    MySQL的InnoDB存储引擎是其最常用的事务处理引擎,它与Oracle数据库有着共通的设计理念。InnoDB存储引擎支持ACID事务、行级锁定、外键约束等特性,使其成为处理高并发和复杂事务场景的理想选择。在配置和管理InnoDB...

Global site tag (gtag.js) - Google Analytics