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

14.1.1 InnoDB as the Default MySQL Storage Engine

2016-06-02 11:01 429 查看
14.1 Introduction to InnoDB

14.1.1 InnoDB as the Default MySQL Storage Engine
14.1.2 Checking InnoDB Availability
14.1.3 Turning Off InnoDB

InnoDB 是一种通用的存储引擎,平衡高可用和高性能。

在MySQL 5.6,InnoDB 是默认的存储引起,执行CREATE TABLE 语句

没有一个ENGINE= clause子句 会创建一个InnoDB表。

InnoDB的优势:

InnoDB表的优化包括:

1.DML 操作遵循 ACID 模型, 有事务提交,回滚和crash-recovery能力来保护数据。

2.行级锁和Oracle风格一致读增加多用户并发和性能

3.InnoDB表安排在你的磁盘上优化基于主键

4.维护数据完整性,InnoDB 也支持外键约束。 在启用外键约束下,

插入,更新和删除被检查来确认 它们不会导致不一致在不同的表。

5. 你可以自由地混合InnoDB表与其他的MySQL存储引擎,即使在相同的语句里。

比如,你可以使用一个关联操作来组合InnoDB和MEMORY 表在一个查询里。

6. InnoDB 已经设计了CPU效率和最大性能当处理大量的数据:

Table 14.1 InnoDB Storage Engine Features:

存储限制  64TB

事务       YES

锁粒度     Row

MVCC       Yes

地理空间数据类型支持 Yes

Geospatial indexing support Yes

B-tree indexes

T-tree indexes

Hash indexes

InnoDB 存储引擎维护它自己的buffer pool用于caching 数据和indexes

在主内存里。 默认的,innodb_file_per_table设置被启用,

每个新的InnoDB 表和它的相关的索引是存储在一个单独的文件。

当 innodb_file_per_table option  被关闭,InnoDB 存储所有它的表和索引

在一个单独的系统表空间,它可以有几个文件组成(或者一个raw disk 分区).

InnoDB 表可以处理大量的数据,即使在操作系统 文件大小被限制为2GB

比较InnoDB的功能和其他的存储引擎,查看存储引擎特性 在 Chapter 15, Alternative

Storage Engines.

InnoDB的增强功能和新功能:

InoDB增强功能和新特性 在MySQL 5.6 的信息:

1.InnoDB 增强功能列表在 Section 1.4, “What Is New in MySQL 5.6”,

提供了在MySQL 5.6中添加的功能概要

Additional Resources  额外的资源:

1.对于InnoDB-相关的术语和定义

14.1.1 InnoDB as the Default MySQL Storage Engine  InnoDB 默认的存储引擎:

InnoDB 是默认存储引擎在MySQL 5.6,

InnoDB 是一个事务安全(ACID 标准)存储引擎对于MySQL 已经提交,回滚和

crash-recovery 功能来保护用户的数据。

InnoDB 行级锁(没有升级到粗颗粒度的锁).

Oracle-风格的一致性非锁定读增加了多用户并发和性能。

InnoDB 存储用户的数据在clustered indexes来降低I/O对于基于主键的常见的查询

为了维护数据的完整性,InnoDB 也支持外键约束

除非你配置了一个不同的存储引擎,执行CREATE TABLE 语句没有指定ENGINE= clause

创建一个InnoDB 表

InnoDB表的好处;

如果你使用MyISAM表 但是没有提交由于技术原因,你可能找到InnoDB表
有益的对于下面的原因:

1.如果你的服务器崩溃因为一个硬件和软件原因,

无论那个时间数据库发生了什么,你不需要做任何事情在重启数据库后。

InnoDB crash recovery 自动完成任何改变 在crash时间点前提交的,

不会做任何改变 在处理时但是没有提交, 只是重启和继续 在你离开的地方

2.InnoDB buffer pool cache表和索引的数据 当数据被访问,

频繁使用的数据是直接从内存里处理, 这个cache应用于很多类型的信息,并加速处理

3. 如果你把相关数据到不同的表,你可以设置外键来强制完整性约束。

更新或者删除数据,相关的数据在其他的表是被更新或者自动删除。

尝试插入数据到一个secodary 表没有相关数据在primary table,那么坏数据会自动被踢出

4.如果数据变得损坏在磁盘或者内存,一个checksum 机制提醒你虚假数据在你使用前

5. 当你设计你的数据库以适当的主键列对于每个表,

操作涉及哪些列会被自动的优化。

它是非常快的来引用主键列在WHERE子句里,ORDER BY 子句,GROUP BY 子句和join关联。

6.插入,更新,和删除会被优化通过一个自动的机制称为change buffering.

InnoDB 不只是允许并发的读和写访问相同的表,它caches 改变的数据到streamline disk

I/O.

7.性能优势不局限于长时间查询的巨型表格。

当相同的记录被访问从表反复的访问,一个功能称为一个自动式的Hash Index 任务

会让那些查询变得更快, 如果它们遇到一个hash 表

8.你可以压缩表和相关的索引

9.你可以创建和删除索引对性能和可用性影响很小

10. Truncate 一个 file_per_table tablespace是很快的,

可以释放次磁盘空间用于操作系统重用,而不是释放空间在system tablespace 只有InnoDB可

以使用

11. 表数据的存储布局是更加有效的对于BLOB和long text 字段, 具有动态行格式

12.你可以监控存储引擎的内部工作情况通过查询INFORMATION_SCHEMA tables.

13.你可以通过查询性能Schema tables 来监控存储引擎的性能细节

InnoDB 表的最新改进:

MySQL 继续努力的解决使用的情况 以前需要MyISAM表的情况,在MySQL 5.6和更高的版本:

1.InnoDB 可以执行全文搜索使用FULL TEXT index类型。

2.InnoDB 现在执行一个更好的只读和以读为主的负载。自动优化应用InnoDB查询在自动提交

模式,

你也可以显示的让事务为只读 语法是START TRANSACTION READ ONLY.

InnoDB 表的最佳实践:

一些常用的最佳实践用于InnoDB表包括:

1.指定一个主键列用于每个表使用最多嘴频繁的查询列或者多列,

或者一个自动增加的值如果没有明显的主键列

2.使用关联无论数据是从多个表基于相同的ID值拉取那些表里。

对于一个快速关联性能,定义外键在关联列上,定义那些列具有相同数据类型在每个表。

增加外键确保相关的列被索引,可以改善性能。外键也会传播删除或者更新到所有相关的表,

避免 数据插入到一个字表如果相应的IDs 是不在父表出现。

3. 关闭自动提交,提交每秒数百次puts 一个性能上限( 由你的存储设备写的速度限制)

4.分组相关的DML操作到事务,通过把它们归为一类 使用 START TRANSACTION和COMMIT 语句

。
这样你不需要太频繁地提交,
你不需要执行大量的批处理插入,修改或者删除

运行几个小时没有提交。

不要使用LOCK TABLE 语句,InnoDB 可以一次处理多个会话都读取和写入相同的表。

不牺牲可靠性或者高性能。 得到排它写访问一个数据集,使用

SELECT ... FOR UPDATE语句来锁住你打算更新的rows.

5.启用 innodb_file_per_table 选项来防止数据和索引对于单独的表到单独的文件,

代替一个单独的巨大的system tablespace.

这个设置是需要使用一些其他的功能, 比如表压缩和快速truncate

6.innodb_file_per_table 选项是在MYSQL 5.6.6中默认启用

7.评估是否你的数据访问模式收益与InnoDB表压缩功能(ROW_FORMAT=COMPRESSED)

在CREATE TABLE 语句,你可以压缩InnoDB 表而不需要牺牲读/写能力

8.运行你的server 带上选项 --sql_mode=NO_ENGINE_SUBSTITUTION

来防止表被创建为一个不同的存储引擎。

测试和设定基准 InnoDB作为默认的存储引擎:

如果 InnoDB 不是你的默认的存储引擎,你可以确定你的数据库服务器或者应用

工作正常 使用InnoDB 通过重启server 带上--default-storage-engine=InnoDB

或者 default-storage-engine=innodb 定义在 [mysqld] 章节在你的my.cnf配置里。

由于改变了默认的存储引擎之影响新表 当它们被创建的时候,

运行你所有的应用安装和安装步骤来确认 所有的安装是正确的。

然后,运用所有的应用程序的功能来确保所有数据的加载,编辑和查询功能正常。

如果一个表依赖一些MyISAM特性功能,你会收到一个错误, 增加ENGINE=MyISAM clause

在创建表的时候来避免错误。

如果你没有最初一个深思熟虑的决定关于存储引擎,

你只想要预览某些表如何工作当它们创建在InnoDB引擎下,

执行ALTER TABLE table_name ENGINE=InnoDB;

对于每个表,或者,运行test查询和其他语句没有描述原始表,做一个表的copy

CREATE TABLE InnoDB_Table (...) ENGINE=InnoDB AS SELECT * FROM MyISAM_Table;

得到一个在网站的应用在真实负荷下的性能观点,安装最新的MySQL版本和运行基准测试。

测试完整应用的生命周期, 从安装,通过大量使用,和服务器重启。

杀掉server 进程当数据库是繁忙来模拟一个断电故障,

验证数据是正常恢复的当重启服务器时。

测试任何复制配置,特别是如果你使用不同的MySQL版本和选项在master和slaves上。

验证InnoDB 是默认的存储引擎:

验证InnoDB是默认的存储引擎

1.执行SHOW ENGINES 命令行来查看不同的存储引擎。

查看DEFAULT 在InnoDB 行,另外,查询INFORMATION_SCHEMA ENGINES table.

mysql> SHOW ENGINES
-> ;
+--------------------+---------

+----------------------------------------------------------------+--------------

+------+------------+
| Engine             | Support | Comment

| Transactions | XA   | Savepoints |
+--------------------+---------

+----------------------------------------------------------------+--------------

+------+------------+
| PERFORMANCE_SCHEMA | YES     | Performance Schema

| NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine

| NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for

temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to

it disappears) | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables

| NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and

foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine

| NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine

| NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine

| NULL         | NULL | NULL       |
+--------------------+---------

+----------------------------------------------------------------+--------------

+------+------------+

2.如果InnoDB 不在场,你有一个mysqld binary 编译时没有InnoDB支持

你需要得到另外一个

3.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: