插件式存储引擎是MySQL数据库最重要的特性之一,用户可以根据不同的存储需求选择最优的存储引擎。存储引擎很重要,因为它决定了表的结构、表的数据、表的索引三者的存储方式。

1.MySQL存储引擎概述

  1. 查询MySQL支持的存储引擎:show engines;,可以看到默认支持的存储引擎是InnoDB,在创建表的时候如果不指定存储引擎,则默认使用的是InnoDB。
# 一共9个,XA表示分布式事务,savepoints表示保存点,事务回滚时使用
*************************** 1. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO

  1. 创建表的时候指定存储引擎
create table t_info (uid int unsigned not null primary key auto_increment, carid char(18) unique not null, addrr varchar(64) not null)engine = MyISAM;
  1. 修改表的存储引擎
alter table t_info engine = InnoDB;

2.常用存储引擎的特性

注:在MySQL8.0中,并不存在NDB和MERGE这两种存储引擎

1.MyISAM
  1. MyISAM不支持外键、事务、行锁。只支持表锁。
  2. 使用MyISAM存储引擎创建的表在磁盘上存储为几个文件:在MySQL5中是表名.frm、表名.MYD、表名.MYI三个文件,其中frm文件存储表定义信息,MYD文件存储数据,MYI存储索引信息;在MySQL8.0中是表名_xxx.sdi、表名.MYI,表名.MYD文件,sdi存储表定义信息。这些文件的目录在哪里?如果在创建表时没有设置过表的存放位置或者更改配置文件的值,则可以:
    1. 查看datadir变量的值:select @@datadir;
    2. 查看表所在的数据库
    3. cd datadir变量的值/数据库名
2.InnoDB
  1. MySQL8.0中默认支持的存储引擎,它支持事务特性、外键、行锁。
  2. 使用InnoDB存储引擎创建的表在磁盘上默认存储为几个文件:在MySQL5中是表名.frm,表名.idb文件,idb文件存储了数据和索引信息;在MySQL8.0中只有表名.ibd文件,内部存储了表定义信息、索引、数据信息。
3.Memory
  1. 使用hash索引,数据存放在内存中,服务一旦关闭则数据丢失。
  2. 每个使用Memory存储引擎创建的表在磁盘上存储为一个文件:在MySQL5中是表名.frm文件,在MySQL8.0中是表名_xxx.sdi文件

问题

  1. MySQL中的存储引擎有什么区别?MySQL中存在很多存储引擎,这里以MySQL8中的MyISAM和InnoDB存储引擎为例:
    1. InnoDB存储引擎支持事务、外键、行锁;而MyISAM不支持事务、外键、行锁,只支持表级别的锁
    2. InnoDB存储引擎会将数据和索引存储在同一个后缀为ibd的文件中,而MyISAM存储引擎将数据和索引存放在不同的文件中,如xxx.MYD和xxx.MYI
    3. InnoDB存储引擎使用聚簇索引,而MyISAM存储引擎使用非聚簇索引。