MySQL各存储引擎(INNODB,MyISAM等)的区别及其启动方法

mysql里有哪些存储引擎?

innodb 和myisam,MEMORY,BLACKHOLE只起来这几种。

innodb myisam的区别在哪里?

这也是个老问题了,myisam里索引的数据是分开,是表级锁,innodb是事务级存储引擎,支付事务,外键。他也没问了,这其它可以答很多的。

如何来进行一个大数据量的优化?

我说首先是根据存储引擎来做优化?不同的存储引擎有不同的优化策越。他也没往细问了,我也简单答了些myisam和innodb的优化。

我答了个对大数据量,分表,分库,他就问一般是怎么分,我回答是我们现在的是直接对用户ID取模,但这样会造成,前期我们评估的空间量,后期是不能变化的。那如果已经有了那么大的量,又已经了对用户取了模,如果来做,我就想到了,一致性哈希这个原理,虚拟一个360度的圆,把数据库节点分布此圆上,如果后期要新增服务器,也只带来了部分用户的变化。

分区的原理,300亿的数据,建立索引是否可行

是否有进行过数据分区的操作?以前有做过,是有按ID,按时间,哈希来进行分区,开始他问我是如果有300亿的数据,建立索引是否可行?我想了下,是可行吧,他回了句,你可能不知道在300亿条数据上建立索引是个什么过程?现在想起来,我觉得他是要我答对数据进行分区,哎,当时警绷了...没想起来。我写的也许肯定不会是正确答案,但在这里也做个参考,做个经验,教训保存起来。

-----------------------------------------------------------------------------------------------------

MySQL存储引擎

MyISAM: 优势 – 查询速度快 – 数据和索引压缩问题 – 表级锁 – 数据丢失

InnoDB: 优势 – 行级锁 – 事务支持 – 数据安全问题 – 数据文件庞大 – 启动慢 – 不支持FULLTEXT索引

  如果你是个赛车手并且按一下按钮就能够立即更换引擎而不需要把车开到车库里去换,那会是怎么感觉呢?MySQL数据库为开发人员所做的就好像是按按钮换引擎;它让你选择数据库引擎,并给你一条简单的途径来切换它。

  MySQL的自带引擎肯定是够用了,但是在有些情况下,其他的引擎可能要比手头所用更适合完成任务。如果愿意的话,你甚至可以使用MySQL++ API来创建自己的数据库引擎,就像打穿气缸装上自己的化油器。现在让我们来看看你该如何选择引擎,以及如何在可用引擎之间切换。

  选择你的引擎

  你能用的数据库引擎取决于MySQL在安装的时候是如何被编译的。要添加一个新的引擎,就必须重新编译MySQL。仅仅为了添加一个特性而编译应用程序的概念对于Windows的开发人员来说可能很奇怪,但是在UNIX世界里,这已经成为了标准。在缺省情况下,MySQL支持三个引擎:ISAM、 MyISAM和HEAP。另外两种类型InnoDB和Berkley(BDB),也常常可以使用。

  ISAM

  ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错:如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MySQL能够支持这样的备份应用程序。

  MyISAM

  MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作。其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMChk工具和用来恢复浪费空间的 MyISAMPack工具。

  MyISAM强调了快速读取操作,这可能就是为什么MySQL受到了Web开发如此青睐的主要原因:在Web开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和Internet平台提供商(Internet Presence Provider,IPP)只允许使用MyISAM格式。

  HEAP

  HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MyISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。让我再重复一遍:在你用完表格之后,不要忘记删除表格。

  InnoDB和Berkley DB

  InnoDB和Berkley DB(BDB)数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MySQL++ API。在使用MySQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB和BDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如前所述,如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用后两个引擎中的一个了。

  如果感觉自己的确技术高超,你还能够使用MySQL++来创建自己的数据库引擎。这个API为你提供了操作字段、记录、表格、数据库、连接、安全帐号的功能,以及建立诸如MySQL这样DBMS所需要的所有其他无数功能。深入讲解API已经超出了本文的范围,但是你需要了解MySQL++的存在及其可交换引擎背后的技术,这一点是很重要的。估计这个插件式数据库引擎的模型甚至能够被用来为MySQL创建本地的XML提供器(XML provider)。 

  1. 属性:自增列不必是:唯一的、primary、正数、bigint
  2. 属性:auto_increment 是mysql在表列定义中的一个可选属性,和默认值属性冲突。
  3. 属性:必须定义在该列上的索引!
  4. 属性:应用于number类型的列:包括各种整数、浮点数、定点数
  5. 属性:自增列可以和普通的数字类型属性(unsigned、zerofill的)、约束(null、not null、[primary] key、unique [key]、check、foreign key)等组合
  6. 属性:表只能有一个自增列。该列必须具有索引。不能在该列定义defaut值。
  7. 语句影响:insert 对自增列可以显示的指定其值进行插入,如果插入的值>种子值,则种子值会自动更新为=该插入的值;即使你一次性插大批数据也是只返回该批次第一行自增后的值!
  8. 语句影响:delete、update 不会影响种子值
  9. 语句影响:truncate 重置种子值到“1”
  10. 语句影响:select * from table_name where auto_increment_col_name is NULL 获得最后插入的第一行数据;即使你一次性插大批数据也是只返回该批次第一行自增后的值!是ODBC兼容语法
  11. 当 向自增列插入NULL时,自增列自增;当 no_auto_value_on_zero=1(enable)时,可以通过向自增列赋值0来产生自增,不推荐!
  12. 插入值后可以通过 last_insert_id () 返回第一行自增后的值,记住:即使是一批插入多条数据,返回的仍然是第一行的值
  13.  特殊的:对于myisam表,特殊的对于myisam引擎的表,你可以在一个多列索引上的第二列上定义自增列:他将在第一索引列上产生自增,可以理解为:在第一索引列上分组,计算该组上的最大值,+1。该形式下:(分组)自增列的种子值总是取该列上的分组 最大值——受delete、update、insert影响。最大的用途应该是分组排序吧
-----------------------------------------------------------------------------------------------------------------

存储引擎是什么?

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

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

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

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

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

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

你可以在MySQL(假设是MySQL server version: 5.0.22-community-nt)中使用显示引擎的命令得到一个可用引擎的列表。 

mysql> show engines;
+------------+---------+----------------------------------------------------------------+
| Engine      | Support | Comment                                                         |
+------------+---------+----------------------------------------------------------------+
| MyISAM      | YES      | Default engine as of MySQL 3.23 with great performance          |
| MEMORY      | YES      | Hash based, stored in memory, useful for temporary tables       |
| InnoDB      | DEFAULT | Supports transactions, row-level locking, and foreign keys      |
| BerkeleyDB | NO       | Supports transactions and page-level locking                    |
| BLACKHOLE   | NO       | /dev/null storage engine (anything you write to it disappears) |
| EXAMPLE     | NO       | Example storage engine                                          |
| ARCHIVE     | YES      | Archive storage engine                                          |
| CSV         | NO       | CSV storage engine                                              |
| ndbcluster | NO       | Clustered, fault-tolerant, memory-based tables                  |
| FEDERATED   | NO       | Federated MySQL storage engine                                  |
| MRG_MYISAM | YES      | Collection of identical MyISAM tables                           |
| ISAM        | NO       | Obsolete storage engine                                         |
+------------+---------+----------------------------------------------------------------+
12 rows in set (0.00 sec)

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

对于MySQL server version: 5.0.22-community-nt,可以使用mysql> show variables like "have_%"(显示类似“have_%”的变量):

mysql> show variables like "have_%";
+-----------------------+----------+
| Variable_name          | Value     |
+-----------------------+----------+
| have_archive           | YES       |
| have_bdb               | NO        |
| have_blackhole_engine | NO        |
| have_compress          | YES       |
| have_crypt             | NO        |
| have_csv               | NO        |
| have_example_engine    | NO        |
| have_federated_engine | NO        |
| have_geometry          | YES       |
| have_innodb            | YES       |
| have_isam              | NO        |
| have_ndbcluster        | NO        |
| have_openssl           | DISABLED |
| have_query_cache       | YES       |
| have_raid              | NO        |
| have_rtree_keys        | YES       |
| have_symlink           | YES       |
+-----------------------+----------+
17 rows in set (0.00 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中MyISAM引擎与InnoDB引擎性能简单测试
[硬件配置]
CPU : AMD2500+ (1.8G)
内存: 1G/现代
硬盘: 80G/IDE

[软件配置]
OS : Windows XP SP2
SE : PHP5.2.1
DB : MySQL5.0.37
Web: IIS6

[MySQL表结构]

CREATE  TABLE `myisam` (
    `id`  int( 11NOT  NULL auto_increment,
    `name`  varchar( 100default  NULL,
    `content`  text,
   PRIMARY  KEY    (`id`)
) ENGINE =MyISAM  DEFAULT CHARSET =gbk;

CREATE  TABLE `innodb` (
    `id`  int( 11NOT  NULL auto_increment,
    `name`  varchar( 100default  NULL,
    `content`  text,
   PRIMARY  KEY    (`id`)
) ENGINE =InnoDB  DEFAULT CHARSET =gbk;



[数据内容]
$name = "heiyeluren";
$content = "MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:· MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。 ·MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。 释:MEMORY存储引擎正式地被确定为HEAP引擎。· InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布的MySQL-Max二进制分发版里。InnoDB也默认被包括在所有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。·EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。";

[插入数据-1] (innodb_flush_log_at_trx_commit=1)
MyISAM 1W:3/s
InnoDB 1W:219/s

MyISAM 10W:29/s
InnoDB 10W:2092/s

MyISAM 100W:287/s
InnoDB 100W:没敢测试

[插入数据-2] (innodb_flush_log_at_trx_commit=0)
MyISAM 1W:3/s
InnoDB 1W:3/s

MyISAM 10W:30/s
InnoDB 10W:29/s

MyISAM 100W:273/s
InnoDB 100W:423/s

[插入数据3] (innodb_buffer_pool_size=1024M)
InnoDB 1W:3/s
InnoDB 10W:33/s
InnoDB 100W:607/s

[插入数据4] (innodb_buffer_pool_size=256M, innodb_flush_log_at_trx_commit=1, set autocommit=0)
InnoDB 1W:3/s
InnoDB 10W:26/s
InnoDB 100W:379/s
[MySQL 配置文件] (缺省配置)

# MySQL Server Instance Configuration File
[ client ]
port=3306

[ mysql ]
default-character-set=gbk

[ mysqld ]
port=3306
basedir="C:/mysql50/"
datadir="C:/mysql50/Data/"
default-character-set=gbk
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100

query_cache_size=0
table_cache=256
tmp_table_size=50M
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_max_extra_sort_file_size=100G
myisam_sort_buffer_size=100M
key_buffer_size=82M
read_buffer_size=64K
read_rnd_buffer_size=256K
sort_buffer_size=256K

innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=2M
innodb_buffer_pool_size=159M
innodb_log_file_size=80M
innodb_thread_concurrency=8


【总结】

可以看出在MySQL 5.0里面,MyISAM和InnoDB存储引擎性能差别并不是很大,针对InnoDB来说,影响性能的主要是 innodb_flush_log_at_trx_commit 这个选项,如果设置为1的话,那么每次插入数据的时候都会自动提交,导致性能急剧下降,应该是跟刷新日志有关系,设置为0效率能够看到明显提升,当然,同样你可以SQL中提交“SET AUTOCOMMIT = 0”来设置达到好的性能。另外,还听说通过设置innodb_buffer_pool_size能够提升InnoDB的性能,但是我测试发现没有特别明显的提升。

基本上我们可以考虑使用InnoDB来替代我们的MyISAM引擎了,因为InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多,当然,相应的在my.cnf中的配置也是比较关键的,良好的配置,能够有效的加速你的应用。

如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

你可能感兴趣的:(MySQL各存储引擎(INNODB,MyISAM等)的区别及其启动方法)