1、mysql存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供不同的功能。通过选择不同的技术,能够获得额外的速度或者功能,从而改善应用的整体功能。Mysql中主要的存储引擎有InnoDB(5.7版本中默认)、MyISAM、MEMORY、CSV等。
# 查看mysql中存储引擎
mysql> show engines\G
*************************** 1. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
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: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
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: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
9 rows in set (0.00 sec)
2、mysql主要存储引擎介绍
(1)InnoDB
InnoDB是目前MySQL版本默认的存储引擎,也是MySQL推荐使用的存储引擎,是集高可靠性和高性能于一身的存储引擎。
InnoDB存储引擎的优势:
1)DML语句支持事务功能,保证ACID特性
2)行级锁的使用保证了高并发的属性
3)InnoDB对有主键的表会依据主键优化查询性能,也称聚簇索引,将所有数据存储在聚簇索引上以减少对主键查询的IO消耗
4)保证数据的一致性:InnoDB支持外键属性
5)能够保证数据的完整性:主机故障导致MySQL重启后,InnoDB会自动识别已经在故障之前提交的数据,并回退所有故障时未提交的数据,最大限度的保护数据不会丢失(crash recovery)
(2)MyISAM
MyISAM存储引擎是MySQL老版本中的默认存储引擎,由于其表级锁的特性,所以限制了其在读写操作时的性能,常用在只读表上或者读操作占绝大多数的表上,比如一些web应用和数据仓库相关表。
每个MyISAM表都会在磁盘上生成三个文件,表名和文件名相同但后缀不同,.frm文件存储表的结构信息,.MYD文件存储表的数据信息,.MYI文件存储表的索引信息
(3)Memory
Memory存储引擎将所有数据存储在内存中以便加快对数据的访问速度, 当MySQL重启时,Memory表中的数据会丢失,但表结构还在; Memory只适用在只读表或者读操作占绝大多数的情况,因为对表的写操作也会导致表锁,大大限制了并发性。
Memory表创建之后,在磁盘文件会生成一个相同表名的文件,后缀为.frm,仅存储表结构而不存储表数据。
(4)CSV
Csv存储引擎下的表对应了文本文件,其中的数据用逗号隔开,csv表可用来以csv格式导入和导出表
创建一个csv表时,磁盘会生成三个以表名为名字的文件,.frm存储表的结构信息;.CSV文件存储以逗号隔开的数据信息;.CSM存储表的元数据,包括表的状态和有多少行数据信息。
(5)ARCHIVE
Archive存储引擎表用来存储大量未加索引的历史归档数据。Archive表支持insert, replace和select语句,但不支持delete和update语句;Archive表支持行级锁;Archive支持auto_incrment列,且其列上可以包含一个索引,但在其他字段上不能创建索引;Archive不支持对auto_incrment列插入一个小于当前最大值的数据;Archive存储引擎会用zlib来压缩数据。
archive表会在磁盘创建两个文件,.frm文件用来存储表结构信息,.ARZ文件用来存储历史归档数据。
(6)Blackhole
Blackhole存储引擎用来接收表插入请求,但不存储数据,所以查询表数据总是返回空,通常用在主从复制的情况下当主库不想保留数据而从库通过复制语句执行而保留数据的情况。
Blackhole表在磁盘会创建一个文件,.frm文件用来存储表结构。
(7)Merge
Merge存储引擎可以将一批字段相同,索引相同且顺序相同的MyISAM表在逻辑上看做是同一个;Merge表支持select,delete,update,insert语句执行;
Merge表在磁盘上创建两个文件,.frm文件保存表的结构信息,.MRG文件包含所有被视作同一个表的MyISAM表。
(8)Federated
Federated存储引擎提供了从一个MySQL实例连接其它实例上数据的能力,Federated存储引擎默认是disable状态,如果要开启,则需要在启动MySQL时使用—federated选项。
(9)Example
Example存储引擎只存在于MySQL源码中,只针对开发者,对实际的数据库使用者没有太大的意义,Example表只保留表结构,本身不保存数据。
(10)NDB
NDB存储引擎专用在MySQL Cluster软件中,是MySQL自己推出的提高可用性和可靠性的集群软件。
3、设置mysql表的存储引擎
1)在my.cnf配置文件中设置default-storage-engine参数表示设置默认存储引擎
2)在MySQL的连接上设置当前连接的默认存储引擎:SET default_storage_engine=NDBCLUSTER;
3)在创建表的时候通过engine=语句指定该表的存储引擎
4)在表创建之后通过alter语句修改表的存储引擎:ALTER TABLE table_name ENGINE = InnoDB。
1、InnoDB主要属性
InnoDB的关键属性包括:
1)ACID事务特性支持,包括commit,rollback以及crash恢复的能力;
2)行级别锁以及多版本并发控制MVCC;
3)利用主键的聚簇索引(clustered index)在底层存储数据,提升对主键查询的IO性能;
4)支持外键功能,管理数据的完整性。
# 开启事务
mysql> start transaction;
mysql> update students set gender=1;
#查看更新后的数据
mysql> select * from students;
+------+-------+--------+---------+
| sid | sname | gender | dept_id |
+------+-------+--------+---------+
| 1 | mike | 1 | 1 |
| 2 | mike | 1 | 2 |
| 3 | mike | 1 | 1 |
+------+-------+--------+---------+
# 回滚
mysql> rollback;
# 查看回滚后的数据
mysql> select * from students;
+------+-------+--------+---------+
| sid | sname | gender | dept_id |
+------+-------+--------+---------+
| 1 | mike | 0 | 1 |
| 2 | mike | 1 | 2 |
| 3 | mike | 0 | 1 |
+------+-------+--------+---------+
为保证并发操作和回滚操作,InnoDB会将修改前的数据存放在回滚段中。InnoDB会在数据库的每一行上额外增加三个字段以实现多版本控制,第一个字段是DB_TRX_ID用来存放针对该行最后一次执行insert、update操作的事务ID(delete操作也会被认为是update);第二个字段是DB_ROLL_PTR指针指向回滚段里对应的undo日志记录;第三个字段是DB_ROW_ID代表每一行的行ID。
回滚段中的undo日志记录只有在事务commit提交之后才会被丢弃,为避免回滚段越来越大,要注意及时执行commit命令。
2、InnoDB的体系结构
(1)缓存池
buffer pool缓存池是InnoDB在内存中开辟的用来缓存表数据和索引数据的区域,一般设置为50%~80%的物理内存大小,通过将经常访问的数据放置到内存当中来加快访问速度。
Buffer pool以page页的格式组成,页之间组成list列表,并通过LRU算法(最近最少使用算法)对长久不使用的页进行置换。数据以整页(16K)位单位读取到缓存中。
(2)Adaptive Hash Index(自适应哈希索引)
Adaptive Hash index属性使得InnoDB更像是内存数据库。该属性通过innodb_adapitve_hash_index开启,也可通过—skip-innodb_adaptive_hash_index参数关闭
InnoDB存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引,所以称之为自适应(adaptive) 的。自适应哈希索引通过缓冲池的B+树构造而来,因此建立的速度很快。而且不需要将整个表都建哈希索引,InnoDB存储引擎会自动根据访问的频率和模式 来为某些页建立哈希索引。
(3)Redo log buffer
Redo log buffer是一块用来存放写入redo log文件内容的内存区域,
配置参数:
innodb_log_buffer_size:内存的大小
innodb_flush_log_at_trx_commi:刷新到文件的方式
innodb_flush_log_at_timeou:刷新的频率
(4)Doublewrite缓存
Doublewrite缓存是位于系统表空间的存储区域,用来缓存InnoDB的数据页从innodb buffer pool中flush之后并写入到数据文件之前,所以当操作系统或者数据库进程在数据页写磁盘的过程中崩溃,Innodb可以在doublewrite缓存中找到数据页的备份而用来执行crash恢复。
(5)Undo日志
Undo日志是由一系列事务的undo日志记录组成,每一条undo日志记录包含了事务数据回滚的相关原始信息,所以当其它的事务需要查看修改前的原始数据,则会从此undo日志记录中获取
Innodb支持最大128个回滚段,其中的32个用来服务临时表的相关事务操作。
Undo log原理:为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
(6)File-per-table表空间
File-per-table表空间意味着innodb的数据表不是共享一个系统表空间,而是每个表一个独立的表空间。可以通过设置innodb_file_per_table开启此属性。
# File-per-table独立表空间默认是开启的
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
(7)temporary表空间
temporary临时表空间用来存放临时表,默认情况下是在数据文件夹下的ibtmp1数据文件,此数据文件被设置为每次自动增长12MB大小。临时表空间文件在正常的shutdown之后会自动清除,但在crash发生时不会清除,这就需要DBA手动去删除表空间文件或重启服务器。
(8)redo log
redo日志是存在于磁盘上的文件,包括ib_logfile0和ib_logfile1两个文件,常用于在crash恢复发生时将还没来得及写入到数据文件中但已经完成提交的事务在数据库初始化时重新执行一遍。
InnoDB对redo log buffer写入到redo log文件的方式提供了组提交(group commit)的方式,意味着针对一次写磁盘操作可以包含多个事务数据,用此方法提高性能。
3、InnoDB持久化
为了IO效率,数据库修改的文件都在内存缓存中完成的;如果出现宕机,数据的持久化是通过读取日志文件中没有被持久化到数据文件里面的记录;将这些记录重新持久化到数据文件中。
配置:
innodb_flush_log_at_trx_commit:配置的值有(0|1|2)分别代表每秒写入并持久化一次,每次commit都持久化,每次commit都写入内存的内存缓存,每秒再刷新到磁盘。
innodb_flush_log_at_timeout:最多丢失多少秒的数据,默认是一秒
4、存储引擎的相关配置
(1)mysql配置文件的优先级
Filename |
Purpose |
读取顺序 |
优先级 |
/etc/my.cnf |
Global options |
最先 |
最低 |
/etc/mysql/my.cnf |
Global options |
依次降低 |
依次升高 |
SYSCONFDIR/my.cnf |
Global options |
||
$MYSQL_HOME/my.cnf |
Server-specific options |
||
defaults-extra-file |
The file specified with --defaults-extra-file=path, if any |
||
~/.my.cnf |
User-specific options |
||
~/.mylogin.cnf |
Login path options |
最后 |
最高 |
(2)系统表空间数据文件配置
配置选项:
innodb_data_home_dir:配置系统表空间文件的存放路径,默认是MySQL安装后的数据文件目录,也可以在innodb_data_file_path中指定绝对路径的数据文件。
Innodb_data_file_path=file_name:file_size[:autoextend[:max:max_file_size]]:配置系统表空间的配置文件,可以包含一个或多个数据文件,中间用;号分开,autoextend和max选项只能用作最后的这个数据文件。Autoextend默认情况下是一次增加64MB,如果要修改此值可通过innodb_autoextend_increment参数。Max用来指定可扩展数据文件的最大容量用来避免数据文件大小超过可用磁盘空间大小。
# 配置系统表空间如下
[mysqld]
innodb_data_home_dir = /data/myibdata/
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
(3)redo日志文件配置
默认情况下InnoDB会在数据文件夹下创建两个48M的日志文件,分别是ib_logfile0和ib_logfile1。
配置选项:
Innodb_log_group_home_dir:指定redo日志的文件位置
innodb_log_files_in_group:定义日志文件的个数,默认和推荐值都是2
innodb_log_file_size:定义每个日志文件的大小,日志文件越大意味着buffer pool进行文件间切换的操作越少,从而减少IO。
(4)undo表空间
默认情况下,undo日志是存放在系统表空间里,但也可以选择在独立的一个或多个undo表空间中存放undo日志。
配置选项:
Innodb_undo_directory:设置独立的undo表空间存放目录
Innodb_undo_logs:设置回滚段的个数,该变量可以动态调整
Innodb_undo_tablespaces:设置独立undo表空间的个数,比如设置为16时则会在undo表空间存放目录下创建16个undo文件,默认为10M
临时表空间:默认情况下,innodb会创建一个自增长的ibtmp1文件在数据文件夹下作为临时表空间数据文件。
临时表空间配置:
Innodb_temp_data_file_path:设置临时表文件路径,文件名和文件大小,设置方法同系统表空间设置
(5)数据页配置
Innodb_page_size参数用来指定所有innodb表空间的数据页大小。默认是16K大小,也可以设置为64K、32K、8K和4K。一般设置为存储磁盘的block size接近的大小.
(6)设置InnoDB只读
InnoDB可以通过—innodb-read-only参数设置数据表只能读取。
# 通过表设置InnoDB表只读
[mysqld]
innodb-read-only=1
(7)InnoDB buffer pool设置
Buffer pool是内存中用来缓存数据和索引的存储区域,是MySQL性能调优的重要一环。Buffer pool的底层是一个列表,通过LRU算法进行数据页的换进换出操作。当空间原因导致新页的加入需要换出一页时,InnoDB取出最近最少使用的页并将这个新的数据页加入到列表的中央。
配置参数:
Innodb_buffer_pool_size:设置缓存表数据和索引数据的内存区域大小,默认为128M,推荐设置为系统内存的50%~80%。大小设置也可以通过动态设置或启动mysql时设置。
innodb_buffer_pool_chunk_size:增加和减少buffer pool的大小
Innodb_buffer_pool_instances:配置多个buffer pool实例,的默认值是1,最大可以调整成64
innodb_old_blocks_pct:控制列表中”old”数据页所占的百分比,默认是37%,等同于3/8,取值范围是5~95
Innodb_old_blocks_time:设置页面读取到buffer pool后但没有移动到经常被访问列表位置的时间窗口,参数默认是1000毫秒
Innodb_log_buffer_size:设置redo log缓存的大小,默认值是16M,其大小取决于是否有某些大的事务会大量修改数据而导致在事务执行过程中就要写日志文件
(8)InnoDB buffer pool预存取(read-ahead)
Read ahead是异步预先获取多个数据页到buffer pool的IO操作,这些数据页都是假定会随后被用到的。InnoDB通过线性read ahead(预测哪些页会被顺序访问)和随机read ahead(通过已经在buffer pool中的数据页来预测哪些页会被随后访问到)两种算法提高IO性能 设置参数:
innodb_read_ahead_threshold:调整顺序数据页的数量,默认值是56,取值范围是0~64
innodb_random_read_ahead=ON:开启随机read ahead
(9)InnoDB buffer pool flushing配置
Innodb会在后台将buffer pool中的脏页(已经修改但没有写到数据文件)flush掉。当buffer pool中的脏页所占百分比达到innodb_max_dirty_pages_pct_lvm会触发flush,当所占比例达到innodb_max_dirty_pages_pct时,则innodb会“强烈”的flush。
设置选项:
Innodb_adaptive_flushing_lwm:为防止redo log被填满,如果redo log的容量超过此阈值,则执行adaptive flush操作。
(10)重置buffer pool状态
InnoDB可以通过配置innodb_buffer_pool_dump_at_shutdown参数来确保在mysql正常重启时部分经常使用的数据页能直接加载到buffer pool中,通过批量加载的方式,以节省重启mysql导致的warmup时间
配置选项:
innodb_buffer_pool_dump_pct:数据页保留占比,可通过通过配置
innodb_buffer_pool_dump_at_shutdown:默认是开启的,也可动态配置
在关闭MySQL时,会把内存中的热数据保存在磁盘里ib_buffer_pool文件中。数据库运行期间保存和重新加载buffer pool的方法是:
SET GLOBAL innodb_buffer_pool_dump_now=ON;
SET GLOBAL innodb_buffer_pool_load_now=ON;
# 保存并从新加载
mysql> SET GLOBAL innodb_buffer_pool_dump_now=ON;
mysql> SET GLOBAL innodb_buffer_pool_load_now=ON;
# 查看buffer_poll保存和重新加载的进度
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';
+--------------------------------+----------------------------------+
| Variable_name | Value
+--------------------------------+--------------------------------+
| Innodb_buffer_pool_dump_status | Buffer pool(s) dump completed at 180929 13:04:11 |
+--------------------------------+----------------------------------+
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_load_status';
+--------------------------------+----------------------------------+
| Variable_name | Value
+--------------------------------+-------------------------------------+
| Innodb_buffer_pool_load_status | Buffer pool(s) load completed at 180929 13:04:13 |
+--------------------------------+------------------------------------+
(11)InnoDB change buffer设置
当修改一个索引块(secondary index)时的数据时,索引块在buffter pool中不存在,修改信息就会被cache在change buffer中,当通过索引扫描把需要的索引块读取到buffer pool时,会和change buffer中修改信息合并,再择机写回disk。目的还是为了减少随机IO带来性能损耗。Change buffer是作为buffer pool中的一部分存在。
配置选项:
Innodb_change_buffering:缓存所对应的操作,值有all:(默认值) |inserts|deletes|changes:(缓存insert和delete操作)|purges(缓存后台执行的物理删除操作)
innodb_change_buffer_max_size:配置change buffer在buffer pool中所占的最大百分比,默认是25%,最大可以设置为50%
(12)InnoDB线程并发度配置
InnoDB利用操作系统的线程技术达到多线程实现
配置选项:
Innodb_thread_concurrency:限制同时执行的线程数。默认值是0代表没有限制。
Innodb_thread_sleep_delay:参数确定
innodb_read_io_threads:后台读线程数,默认值是4,容许的取值范围是1-64
innodb_write_io_threads:后台写线程数,默认值是4,容许的取值范围是1-64
(13)使用Linux异步IO
InnoDB在Linux平台使用异步IO子系统完成数据文件页的读写请求,默认是开启状态,并且需要libaio系统库支持。
配置选项:
innodb_user_native_aio
(14)InnoDB主线程配置
InnoDB的主线程在后台承担了诸多的任务,绝大多数是和IO操作相关的,比如将buffer pool中的修改后的数据刷新的磁盘文件中。
配置参数:
Innodb_io_capacity:设置了InnoDB的整体IO能力。该参数应该被设置为等同于操作系统每秒的IO操作数量。可以设置为100及以上的任意数值,默认值是200。其中设置为100相当于7200RPM的磁盘性能。
(15)InnoDB purge配置
InnoDB的purge操作是一类垃圾回收操作,是由一个或多个独立线程自动执行。 配置选项:
innodb_purge_threads:设置purge线程的数量,如果DML操作比较复杂且涉及到多个表时,则可以考虑增加此值,最大可以设置为32
(16)InnoDB 优化器统计信息配置
Innodb表的优化器统计信息分为永久和非永久两种。永久的优化器统计信息即使是服务器重启的情况下也会存在,其用来选出更优的执行计划以便提供更好的查询性能。
配置参数:
innodb_stats_auto_recalc:控制统计信息是否在表发生巨大变化(超过10%的行)之后是否自动更新,但由于自动更新统计信息本身是异步的,所以有时未必能马上更新,这是可以执行analyze table语句来同步更新统计信息。
innodb_stats_persistent=ON:设置统计信息存储在磁盘上
innodb_stats_persistent_sample_pages:设置参与评估的数据页的数量,默认值是20。当语句执行的执行计划不是最优选择时,则考虑增加此参数,以便获得正确的统计资料。
优化器永久统计资料数据在系统表mysql.innodb_table_stats和mysql.innodb_index_stats表中存储,这两个表中有个字段last_update可以用来判断统计信息最后更改时间
(17)索引页之间合并阈值
通过配置merge_threshold来确保当索引页的数据由于删除操作或者修改操作低于阈值,InnoDB会将此索引页和邻近的索引页合并。默认值是50,取值范围是1到50。 Merge_threshold参数可以定义在表上,也可以定义在一个独立的索引上。
评估merge_threshold参数合理的方法是查看innodb_metrics表里的相关参数,确保发生了较少的索引页合并且合并请求和成功合并的数量相当
(18)配置单表数据文件表空间
InnoDB的单表数据文件表空间代表每个InnoDB表的数据和索引数据都存放在单独的.ibd数据文件中,每个.ibd数据文件代表独立的表空间。
优势:当删除表或者truncate表的时候,意味着对磁盘空间可以回收。而共享表空间时删除一个表时空间不会释放而只是文件里有空闲
缺点:每个表都有未使用的空间,意味着磁盘空间有些浪费
配置选项:
innodb_file_per_table:值为1时为独立表空间,为0时则为共享表空间。
通过命令create table … data directory=’绝对路径’可以将单表数据文件创建在另外的目录里。同时在MySQL的默认数据文件下的数据库名文件夹下会创建table_name.isl文件包含了此表的路径,相当于link文件。
# 在test表里面创建test123表,将数据文件存放在/tmp下
mysql> create table test123 (id int primary key,name varchar(12)) DATA DIRECTORY = '/tmp';
]# ll /data/mysql/data/test/test123.*
-rw-r----- 1 mysql mysql 8586 Sep 30 02:23 /data/mysql/data/test/test123.frm
-rw-r----- 1 mysql mysql 21 Sep 30 02:23 /data/mysql/data/test/test123.isl
[root@localhost ~]# ll /tmp/test/test123*
-rw-r----- 1 mysql mysql 98304 Sep 30 02:23 /tmp/test/test123.ibd
(19)设置undo_log独立表空间
undo log默认是存储在系统表空间里,我们可以将其存放在一个或多个独立表空间下。
配置参数:
Innodb_undo_tablespaces:定义了有多少个undo表空间,此参数只能在建立MySQL实例时被配置
innodb_undo_directory:定义了undo表空间的存放路径
innodb_undo_logs:定义了回滚段的数量
Innodb_undo_log_truncate:是否开启undo表空间清空,如果设置为ON后,则代表undo文件大小超过innodb_max_undo_log_size(默认值是128M)的都标记为清空。
(20)InnoDB普通表空间
通过create tablespace命令可以创建一个共享的InnoDB表空间,和系统表空间一样,多个表可以在此表空间上存储数据,此表空间的数据文件可以放置在任意的文件夹下。创建格式如下:
CREATE TABLESPACE tablespace_name
ADD DATAFILE 'file_name'
[FILE_BLOCK_SIZE = value]
[ENGINE [=] engine_name]
当创建完表空间之后,就可以通过create table …tablespace或者alter table … tablespace命令将表增加到此表空间上。
# 创建一个表空间
mysql> create tablespace test01 add datafile '/tmp/test/test01.ibd' Engine=InnoDB;
# 将表test123的表空间移动表空间test01
mysql> alter table test123 tablespace test01;
删除表空间时用drop tablespace语句来执行,当删除一个普通表空间时,首先需要保证此表空间上的所有表都被删除,否则会报错。
通过alter table命令可以将InnoDB表在系统表空间、独立表空间和普通表空间之间转化:
从系统表空间或者独立表空间上转移到普通表空间:
ALTER TABLE tbl_name TABLESPACE [=] tablespace_name
从普通表空间或者独立表空间上转移到系统表空间
ALTER TABLE tbl_name ... TABLESPACE [=] innodb_system
从系统表空间或者普通表空间转移到独立表空间
ALTER TABLE tbl_name ... TABLESPACE [=] innodb_file_per_table
Alter table … tablespace语句的执行都会导致此表会重建,即使表空间的属性和之前是一样的。