MySQL Study之--MySQL innodb存储架构

原创 2015年07月10日 17:37:03
MySQL Study之--MySQL innodb存储架构

     Oracle的数据存储有表空间、段、区、块、数据文件;MySQL InnoDB的存储管理也类似,但是MySQL增加了一个共享表空间和独立表空间的概念

完整的表空间,会被分成如下结构供给InnoDB使用。


最小单位是page,每个page为16K;64个连续的page组成一个extent; 

多个extent和page构成一个segment。

Segment初始时InnoDB会为它分配32个pages,之后根据需要会将extent分配给 segment,单次最多会分配4个extents给segment。

1、共享表空间

  某一个数据库的所有的表数据,索引文件全部放在一个文件中,默认这个共享表空间的文件路径在data目录下。 默认的文件名为ibdata1  初始化为10M。

  由于是默认的方式,就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个(或几个)文件中,比较利于管理,而且在操作的时候只需要open这一个(或几个)文件即可,相对来说代价很低。

2、独占表空间

  每一个表都将会以独立的文件方式来进行存储,每一个表都有一个.frm表描述文件,还有一个.ibd文件。 其中这个文件包括了单独一个表的数据内容以及索引内容。


案例分析:
[root@mysrv ~]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.6.4-m7-log Source distribution
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like 'innodb_file_%table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+
1 row in set (0.00 sec)

查看表空间文件:
[root@mysrv ~]# cd /usr/local/mysql/data/mysql/
[root@mysrv mysql]# ls -l
total 30088
-rw-rw---- 1 mysql mysql       56 Jun 30 17:12 auto.cnf
-rw-rw---- 1 mysql mysql 18874368 Jul 10 10:44 ibdata1
-rw-rw---- 1 mysql mysql  5242880 Jul 10 10:44 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Jun 30 17:12 ib_logfile1
-rw-rw---- 1 mysql mysql      124 Jul 10 10:44 master.info


修改表空间模式:

首先编辑my.cnf配置文件:
[root@mysrv ~]#  cat /etc/my.cnf
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
table_open_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
datadir=/usr/local/mysql/data/mysql
log-bin=mysql-bin
innodb_file_per_table = 1


2、重新启动mysql server:

mysql> show variables like 'innodb_file_%table%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
<span style="color:#ff0000;"><strong>| innodb_file_per_table | ON </strong></span>   |
+-----------------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'innodb_%data%';
+--------------------------+------------------------+
| Variable_name            | Value                  |
+--------------------------+------------------------+
| innodb_data_file_path    | ibdata1:10M:autoextend |
| innodb_data_home_dir     |                        |
| innodb_stats_on_metadata | ON                     |
+--------------------------+------------------------+
3 rows in set (0.00 sec)

表空间改为独立模式

案例:创建table,查看生成的表空间
mysql> use prod;
Database changed
mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1             |
+----------------+
1 row in set (0.03 sec)

mysql> create table t2 as select * from t2;
ERROR 1146 (42S02): Table 'prod.t2' doesn't exist
mysql> create table t2 as select * from t1;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1             |
| t2             |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from t2;
+------+------+
| id   | name |
+------+------+
|    4 | rose |
|    5 | john |
+------+------+
2 rows in set (0.00 sec)

mysql> create table t3 as select * from t1;
Query OK, 2 rows affected (0.08 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1             |
| t2             |
| t3             |
+----------------+
3 rows in set (0.00 sec)

mysql> select * from t3;
+------+------+
| id   | name |
+------+------+
|    4 | rose |
|    5 | john |
+------+------+
2 rows in set (0.00 sec)

mysql> 

查看生成的表空间文件:

[root@mysrv mysql]# ls -l
total 30112
-rw-rw---- 1 mysql mysql       56 Jun 30 17:12 auto.cnf
-rw-rw---- 1 mysql mysql 18874368 Jul 10 17:28 ibdata1
-rw-rw---- 1 mysql mysql  5242880 Jul 10 17:28 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Jun 30 17:12 ib_logfile1
-rw-rw---- 1 mysql mysql      124 Jul 10 17:26 master.info
drwx--S--- 2 mysql mysql     4096 Jun 30 17:15 mysql
-rw-rw---- 1 mysql mysql      114 Jun 30 17:15 mysql-bin.000001
-rw-rw---- 1 mysql mysql    63438 Jun 30 17:15 mysql-bin.000002
-rw-rw---- 1 mysql mysql  1096670 Jun 30 17:15 mysql-bin.000003
-rw-rw---- 1 mysql mysql      252 Jun 30 17:26 mysql-bin.000004
-rw-rw---- 1 mysql mysql      114 Jun 30 17:40 mysql-bin.000005
-rw-rw---- 1 mysql mysql      133 Jun 30 17:51 mysql-bin.000006
-rw-rw---- 1 mysql mysql      114 Jun 30 17:56 mysql-bin.000007
-rw-rw---- 1 mysql mysql      114 Jul  8 15:17 mysql-bin.000008
.....
-rw-rw---- 1 mysql mysql      380 Jul 10 17:26 mysql-bin.index
drwx--S--- 2 mysql mysql     4096 Jun 30 17:15 performance_schema
drwx--S--- 2 mysql mysql     4096 Jul 10 17:28 prod
-rw-rw---- 1 mysql mysql       58 Jul 10 17:26 relay-log.info
drwx--S--- 2 mysql mysql     4096 Jun 30 17:15 test
[root@mysrv mysql]# cd prod
[root@mysrv prod]# ls
db.opt  t1.frm  t2.frm  t2.ibd
[root@mysrv prod]# ls
db.opt  t1.frm  t2.frm  t2.ibd  t3.frm  t3.ibd
[root@mysrv prod]# ls -lh
total 232K
-rw-rw---- 1 mysql mysql   65 Jun 30 18:14 db.opt
-rw-rw---- 1 mysql mysql 8.4K Jun 30 18:15 t1.frm
-rw-rw---- 1 mysql mysql 8.4K Jul 10 17:28 t2.frm
-rw-rw---- 1 mysql mysql  96K Jul 10 17:28 t2.ibd
-rw-rw---- 1 mysql mysql 8.4K Jul 10 17:29 t3.frm
-rw-rw---- 1 mysql mysql  96K Jul 10 17:29 t3.ibd
----以上查询可以看出,每一个表都对应一个表空间文件



版权声明:本文为博主原创文章,未经博主允许不得转载。

MySQL架构设计——MyISAM存储引擎与InnoDB存储引擎

从MySQL5.1开始,MySQL引入了一个新的概念,插件式存储引擎体系结构。可以做到存储引擎层与SQL层各自更为独立,耦合更小,最重要的是方便了存储引擎的加载与移出,可以做到运行时加载新的存储引擎,...
  • zhangliangzi
  • zhangliangzi
  • 2016年05月12日 14:32
  • 2184

MySQL InnoDB存储引擎参数详解及优化

innodb_data_home_dir 这是InnoDB表的目录共用设置。如果没有在 my.cnf 进行设置,InnoDB 将使用mysql的datadir目录为缺省目录。如果设定一个空字串,...
  • orion61
  • orion61
  • 2015年04月10日 09:44
  • 654

MySQL innodb存储引擎做成表分区

详细描述总结请看MySQL分区(一) 例子:该例子为本人个人学习总结分享->详细说明-->有问题欢迎前来交流...
  • leyangjun
  • leyangjun
  • 2014年07月28日 17:14
  • 964

MySQL存储引擎中的MyISAM和InnoDB区别详解

在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问。为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的...
  • lc0817
  • lc0817
  • 2016年10月08日 15:39
  • 1528

mysql存储引擎memory,ndb,innodb之选择

1 mysql的innodb和cluster的NDB引擎都支持事务,在有共同的特性外,也有不同之处: 以mysql cluster NDB 7.3和MySQL 5.6之InnoDB为例: ndb7.3...
  • BeiiGang
  • BeiiGang
  • 2015年02月04日 14:50
  • 11736

浅析Mysql InnoDB存储引擎事务原理

一 事务的分类 1.1 扁平事务 要么都执行,要么都回滚,InnoDB最常用,最常见的事务. 1.2 带有保存点的偏平事务 事务的操作过程有 begin, A, B, C, D, commit...
  • xubo_ob
  • xubo_ob
  • 2017年05月02日 11:19
  • 130

MySQL存储引擎InnoDB与Myisam的六大区别

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用: MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FED...
  • liu857279611
  • liu857279611
  • 2016年06月01日 20:50
  • 421

mysql安装InnoDB存储引擎

InnoDB存储引擎在mysql 5.1.*以上版本不再作为默认的存储引擎,默认不安装。安装InnoDB,有以下2种方法: 1.安装mysql之前,对configure的参数进行设置 --with...
  • jamesyzhan
  • jamesyzhan
  • 2014年11月15日 12:58
  • 1927

MySQL中的存储引擎讲解(InnoDB,MyISAM,Memory等各存储引擎对比)

MySQL中的存储引擎: 1、存储引擎的概念 2、查看MySQL所支持的存储引擎 3、MySQL中几种常用存储引擎的特点 4、存储引擎之间的相互转化...
  • QH_JAVA
  • QH_JAVA
  • 2013年11月05日 21:40
  • 22048

MySQL innoDB索引底层原理详解

本文介绍MySQL的InnoDB索引相对底层原理相关知识,涉及到B+Tree索引和Hash索引,但本文主要介绍B+Tree索引,其中包括聚簇索引和非聚簇索引,InnoDB数据页结构详解,B+Tree索...
  • u012978884
  • u012978884
  • 2016年09月02日 21:25
  • 9510
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MySQL Study之--MySQL innodb存储架构
举报原因:
原因补充:

(最多只允许输入30个字)