MySQL存储引擎

存储引擎就是一种数据存取和处理方式;MySQL存储引擎是一种插件式设计方式。

1.查看MySQL支持什么存储引擎

mysql> show engines\G
*************************** 1. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

Engine: 存储引擎的名称;

Support:当前是否支持;

Comment:存储引擎的简要描述;

Transactions:是否支持事务;

XA:是否支持分布式事务;

Savepoints:是否支持保存点;

2.MEMORY存储引擎

mysql> create table t_mem(id int) engine=memory;
Query OK, 0 rows affected (0.00 sec)

mysql> show create table t_mem;
+-------+-------------------------------------------------------------------------------------------+
| Table | Create Table                                                                              |
+-------+-------------------------------------------------------------------------------------------+
| t_mem | CREATE TABLE `t_mem` (
  `id` int(11) DEFAULT NULL
) ENGINE=MEMORY DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

当MySQL服务关闭时候,MEMORY引擎中的数据都丢失,当然,表结构会保留。分配给MEMORY引擎的内存正常状态下不会释放,而是右MEMORY引擎一致持有,即使删除MEMORY引擎表中的数据,内存也不会被回收,只有表重建或删除时候才会被回收。MEMORY表能够使用的最大内存空间不能超过max_heap_table_size,默认是16M

3.CSV存储引擎

 CSV(Comma Separated Values逗号分割)

mysql> create table t_csv1(id int not null,v1 varchar(20) not null) engine=csv;
Query OK, 0 rows affected (0.01 sec)

mysql> show create table t_csv1;
+--------+------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                     |
+--------+------------------------------------------------------------------------------------------------------------------+
| t_csv1 | CREATE TABLE `t_csv1` (
  `id` int(11) NOT NULL,
  `v1` varchar(20) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=latin1 |
+--------+------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> insert into t_csv1 values(1,'ss');
Query OK, 1 row affected (0.01 sec)

可以查看数据文件

[root@localhost gis]# ls
db.opt gisusers.ibd t3.ibd t4.ibd t5.ibd t_csv1.CSV test.frm t_mem.frm t_tx_zwyc_wlg.ibd
gisusers.frm t3.frm t4.frm t5.frm t_csv1.CSM t_csv1.frm test.ibd t_tx_zwyc_wlg.frm
[root@localhost gis]# cat t_csv1.CSV
1,"ss"

也可以直接编辑数据文件

所有列都必须指定NOT NULL,CSV不支持索引,不支持分区;

4.ARCHIVE存储引擎

基于归档存储引擎的对象,能够将大量数据压缩存储,插入的列会被压缩,ARCHIVE引擎使用zlib无损压缩所发,并且可以使用OPTIMIZE TABLE分析表并使用打包成更小的格式。

mysql> create table t_arc engine=archive as select * from gisusers;
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0


mysql> show create table t_arc\G *************************** 1. row *************************** Table: t_arc Create Table: CREATE TABLE `t_arc` ( `username` varchar(20) DEFAULT NULL, `sex` tinyint(4) DEFAULT NULL, `birth` date DEFAULT NULL, `address` varchar(50) DEFAULT NULL, `phone` varchar(15) DEFAULT NULL, `email` varchar(20) DEFAULT NULL ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1 1 row in set (0.00 sec)

 ARCHIVE仅支持insert和select语句,不支持update,delete,replace语句,能够支持order by语句,能支持行级别锁,不支持索引,插入效率搞,占用空间小。

5.BLACKHOLE存储引擎

BLACKHOLE存储引擎插入的数据都不会保存,永远保持为空。

mysql> create table t_bho(id int) engine=blackhole;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_bho values(22);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_bho;
Empty set (0.00 sec)

6.MERGE引擎

MERGE引擎也称为MGR_MyISAM引擎,它实际上是将一组MyISAM引擎表聚合在一起,使用时候就像一张表,以此来简化查询操作,MERGE引擎表要求基表拥有相同的列和索引信息,甚至列的定义和顺序,索引的定义和顺序都必须一致。

mysql> create table t_merge1(id int not null primary key,v1 varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

mysql> create table t_merge2(id int not null primary key,v1 varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_merge1 values(1,'aa');
Query OK, 1 row affected (0.00 sec)

mysql> insert into t_merge2 values(2,'bb');
Query OK, 1 row affected (0.01 sec)

mysql> create table t_merge3 (id int not null primary key,v1 varchar(20)) engine=merge union(t_merge1,t_merge2);
Query OK, 0 rows affected (0.01 sec)

mysql> select * from t_merge3;
+----+------+
| id | v1 |
+----+------+
| 1 | aa |
| 2 | bb |
+----+------+
2 rows in set (0.00 sec)

MERGE引擎并不存储数据,它只是起一个汇总作用,也可以执行插入,修改,删除,不过在自行插入的时候要指定默认的表:

mysql> alter table t_merge3 insert_method=first;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> insert into t_merge3 values(4,'CC');
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_merge3;
+----+------+
| id | v1   |
+----+------+
|  1 | aa   |
|  4 | CC   |
|  2 | bb   |
+----+------+
3 rows in set (0.00 sec)

mysql> select * from t_merge1;
+----+------+
| id | v1   |
+----+------+
|  1 | aa   |
|  4 | CC   |
+----+------+
2 rows in set (0.00 sec)

7.FEDERATED存储引擎

访问远端MySQL数据库实例中的对象。

8.MyISAM存储引擎

mysql> create table t_myisam2(id int) engine=myisam;
Query OK, 0 rows affected (0.01 sec)

对象创建后,在物理层面,咩歌MyISAM表对象都有3个独立的操作系统文件组成,文件名与表名相同,文件的扩展名下面3个类型:

    .frm:对象结构定义文件,用于存储表对象结构;

    .YMD:数据文件,用于存储数据表;

    .YMI:索引文件:用户存储表的索引文件

-rw-r----- 1 mysql mysql   8556 5月  14 23:04 t_myisam2.frm
-rw-r----- 1 mysql mysql      0 5月  14 23:04 t_myisam2.MYD
-rw-r----- 1 mysql mysql   1024 5月  14 23:04 t_myisam2.MYI

MyISAM引擎特性:

       MySQL自带的mysql和information_schema两个系统数据库,其内部表对象就是使用MyISAM引擎;

       缺点是:粒度太粗,不支持事务;

       优点:查询块,读写块;

MyISAM引擎存储格式:

        在存储数据的时候MyISAM支持3中不同的存储格式:定长(FIXED,也称为静态)、动态(DYNAMIC)和压缩(COMPRESSED),其中前两种不需要指定,会在创建对象的时候根据列的类型自动适配(如果没有BLOB或TEXT类型列的话)也可以在执行CREATE TABLE或者ALTER TABLE语句时候,通过ROW_FORMAT选项强制指定,第三种用专用工具-myisampack创建。

      所谓静态格式表,表中不包含变长类型的列(varchar、varbinary、blob、text)定义每一列保存的均是固定的字节数。 

mysql> show table status like 't_myisam3%'\G
*************************** 1. row ***************************
           Name: t_myisam3
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 4222124650659839

用ROW_FORMAT选项,可以指定表的对象为静态表:

mysql> create table t_myisam4(id int,name varchar(20)) ROW_FORMAT=FIXED engine=myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> show table status like 't_myisam4%'\G
*************************** 1. row ***************************
           Name: t_myisam4
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0

 静态表的特点:

          对于CHAR、VARCHAR类型的列会填充到定义的长度;

          较快、易于缓存;

          易于崩溃重建、因为记录保存的位置是固定的;

          一般不需要重建;

         通常比动态格式的表占用更多的磁盘空间;

动态表:

        包含变长的字符类型,也可以用ROW_FORMAT指定,但是如果有BLOB、TEXT类型的无法指定为静态的表。

动态表的特点:

       除了字符串长度小于4的列外,其他字符列长度都是动态的;

       每行记录了的行头都有一个bitmap,标识该行那些类包含空自妇产;

       相对静态表,相同列长定义的情况下,有可能会省一定空间;

       每行仅存储实际需要的空间,如果记录变大,有可能会分片保存,这也是行碎片产生的原有;

       相对静态表恢复更复杂。

 

mysql> create table t_myisam6(id int,name varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.01 sec)
mysql> show table status like 't_myisam6%'\G
*************************** 1. row ***************************
           Name: t_myisam6
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 0
 Avg_row_length: 0

 9.InnoDB存储引擎

 InnoDB存储引擎有.frm表结构定义文件外,还有一个同名的.ibd文件,这个文件就是表空间文件;

 InnoDB存储引擎特性

  •         遵循ACID模型,支持事务,拥有从服务崩溃中恢复的能力,能够最大限度的保护数据;
  •          ACID即事务的四个特性:原子性(Atomiocity)、一致性(Consistency)、隔离性(Isolation)、持久性(Druability);
  •          支持行级锁;
  •          InnoDB引擎表组织数据时候按照主键聚簇;
  •         InnoDB拥有自己独立的缓冲池;

InnoDB存储引擎配置:

  •       指定InnoDB引擎数据文件保存路径;可以通过 innodb_data_home_dir=/data/mysqldata/3306/innodb_ts   也可以  innodb_data_file_path=/data/mysql/3306/innodb-ts/ibdata01.df:2048M:autoextend:max:100G
  •       设置多重表空间,每个表对象拥有独享的.ibd为扩展名的数据文件;  set    global   innodb_file_table=1   来控制,设置为1表示启用多重表空间,设置为0表示关闭。
  •       配置InnoDB日志文件:   innoDB_log_group_home_dir    innodb_log_file_size    innodb_log_files_in_group

     innodb_fast_shutdown参数:这是系统用来控制Innodb的关闭模式,共有0、1、2三种模式,默认是1,这种模式下,InnoDB将关闭会话终止连接,将已经提交的数据刷新志数据文件,未提交的事务回退,类似于Oracle的shutdown  immediate;如果是0,则要等到所有的回话结束,所有的事务结束,缓存的数据刷新到磁盘类似Oracle的shutdown  normal,模式如果是2,则直接关闭,类似Oracle的shutdown  abort;      

 查看数据库innodb_fast_shutdown设置:

mysql> show global variables like '%innodb_fast_shutdown%';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1     |
+----------------------+-------+
1 row in set (0.01 sec)

修改l日志的大小及数量

原来的文件:
-rw-r----- 1 mysql mysql 48M 5月 17 21:59 ib_logfile0 -rw-r----- 1 mysql mysql 48M 5月 4 21:50 ib_logfile1
[root@localhost mysql]# systemctl stop mysqld

  [root@localhost mysql]# vi /etc/my.cnf

  innodb_log_file_size=128M

  innodb_log_files_in_group=3

启动数据库:

-rw-r----- 1 mysql mysql 134217728 5月 18 02:06 ib_logfile0
-rw-r----- 1 mysql mysql 134217728 5月 18 02:06 ib_logfile1
-rw-r----- 1 mysql mysql 134217728 5月 18 02:06 ib_logfile2

设置独立的UNDO表空间

 innodb_undo_directory:用于指定保存物理文件的位置;

innodb_undo_tablespaces;用户指定undo表空间的数量,每个表空间都是独立的.idb文件;

 设置事务支持

     禁用事务自动提交

回话级别的设置:
mysql> show variables like 'autocommit'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql> set autocommit=off; Query OK, 0 rows affected (0.00 sec)

mysql> insert into t3 values(22);
Query OK, 1 row affected (0.00 sec)

mysql> select * from t3;
+------+
| id |
+------+
| 22 |
+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.02 sec)

mysql> select * from t3;
Empty set (0.00 sec)

显示的声明事务

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into t3 values(4);
Query OK, 1 row affected (0.01 sec)

mysql> select * from t3;
+------+
| id   |
+------+
|    4 |
+------+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t3;
Empty set (0.00 sec)

 10.InnoDB存储引擎逻辑存储机构

  • 页(Pages,也叫块):InnoDB中的最小管理单位,默认大小16KB,可选值有4KB,8KB,16KB三种;
  • 扩展(Extend,也叫区):每个扩展1MB大小,由64个16KB的页组成(页大小为8KB是则由128个组成,页大小为4KB时候则由256个组成);
  • 段(Segments):段本身有很多种,比如数据段,索引段,回滚段,对于InnoDB来说,段则是独立表空间对应的数据文件;
  • 表空间(Tablespaces):表空间。

 11.联机DDL测试

      algorithm=inplace 就地操作, 

mysql> alter table t_idb_big add index ind_data_type (data_type),algorithm=inplace;
Query OK, 0 rows affected (0.36 sec)
Records: 0  Duplicates: 0  Warnings: 0

   删除索引,空间也不会释放;

mysql> alter table t_idb_big drop index ind_data_type,algorithm=inplace;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

 algorithm=copy  将对象中的数据重新复制一份的方式修改

mysql> create index index_ind_type on t_idb_big(data_type) algorithm=copy;
Query OK, 50176 rows affected (1.50 sec)
Records: 50176  Duplicates: 0  Warnings: 0

删除后,将磁盘的空间释放

mysql> drop index index_ind_type on t_idb_big algorithm=copy;
Query OK, 50176 rows affected (1.07 sec)
Records: 50176  Duplicates: 0  Warnings: 0

 lock子句控制DML

LOCK=NONE:允许对表进行查询和跟新操作;

LOCK=SHARED:仅允许同时对表进行查询操作,不能跟新记录;

LOCK=EXCLUSIVE:不允许同时进行查询和跟新操作。

 

 

 

 

 

 

 

 

       

 

posted @ 2022-05-24 09:00  中仕  阅读(2)  评论(0编辑  收藏  举报