正文
mysql怎么创建表空间 mysql怎么创建表语句
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
什么是表空间和系统表空间
一、系统表空间
在 MySQL 数据目录下有一个名为 ibdata1 的文件,可以保存一张或者多张表。
923275 12M -rw-r----- 1 mysql mysql 12M 3月 18 10:42 ibdata1
这个文件就是 MySQL 的系统表空间文件,默认为 1 个,可以有多个,只需要在配置文件 my.cnf 里面这样定义即可。
innodb_data_file_path=ibdata1:200M;ibdata2:200M:autoextend:max:800M系统表空间不仅可以是文件系统组成的文件,也可以是非文件系统组成的磁盘块,比如裸设备,定义也很简单innodb_data_file_path=/dev/nvme0n1p1:3Gnewraw;/dev/nvme0n1p2:2Gnewraw
系统表空间里都有些啥内容?
具体内容包括:double writer buffer、 change buffer、数据字典(MySQL 8.0 之前)、表数据、表索引。
那 MySQL 为什么现在主流版本默认都不是系统表空间?
究其原因,系统表空间有三个最大的缺点:原因 1:无法做到自动收缩磁盘空间,造成很大的空间浪费。即使它包含的表都被删掉,这部分空间也不会自动释放。
二、单表空间
单表空间不同于系统表空间,每个表空间和表是一一对应的关系,每张表都有自己的表空间。具体在磁盘上表现为后缀为 .ibd 的文件。比如表 t1,对应的表空间文件为 t1.ibd917107 96K -rw-r----- 1 mysql mysql 96K 3月 18 16:13 t1.ibd
单表空间如何应用到具体的表呢?
有两种方式:方式 1:在配置文件中开启。在配置文件中开启单表空间设置参数 innodb_filer_per_table,这样默认对当前库下所有表开启单表空间。innodb_file_per_table=1另外也可以直接建表时指定单表空间mysql create table t1 (id int, r1 char(36)) tablespace innodb_file_per_table;
Query OK, 0 rows affected (0.04 sec)
单表空间除了解决之前说的系统表空间的几个缺点外,还有其他的优点,详细如下:
1. truncate table 操作比其他的任何表空间都快;
2. 可以把不同的表按照使用场景指定在不同的磁盘目录;
比如日志表放在慢点的磁盘,把需要经常随机读的表放在 SSD 上等。
mysql create table ytt_dedicated (id int) data directory = '/var/lib/mysql-files';
Query OK, 0 rows affected (0.04 sec)3. 可以用 optimize table 来收缩或者重建经常增删改查的表。一般过程是这样的:建立和原来表一样的表结构和数据文件,把真实数据复制到临时文件,再删掉原始表定义和数据文件,最后把临时文件的名字改为和原始表一样的。
三、通用表空间
通用表空间先是出现在 MySQL Cluster 里,也就是 NDB 引擎。从 MySQL 5.7 引入到 InnoDB 引擎。通用表空间和系统表空间一样,也是共享表空间。每个表空间可以包含一张或者多张表,也就是说通用表空间和表之间是一对多的关系。
mysql如何建表空间
在mysql中mysql怎么创建表空间,也出现了类似oracle中的表空间概念。
不过二者好像不同mysql怎么创建表空间?具体不太清楚oracle是怎么回事。
mysql表空间是什么概念呢?
开启了Innodb的innodb_file_per_table这个参数之后【innodb_file_per_table = 1】,也就是启用InnoDB的独立表空间模式,便于管理。此时,在新建的innodb表的数据库目录下会多出来一个.ibd这个文件。这个就是此时的数据文件了。mysql会把这个innodb表的数据存放在这个文件中。并且每个innodb表此时都会对应这么一个ibd文件。
看官方文档mysql怎么创建表空间:
If innodb_file_per_table is disabled (the default), InnoDB creates tables in the system tablespace. Ifinnodb_file_per_table is enabled, InnoDB creates each new table using its own .ibd file for storing data and indexes, rather than in the system tablespace.
那么这样做有什么好处呢?
可以实现单表在不同的数据库之间移动。具体怎么移动呢?假设有两个数据库,一个test,一个tt。
InnoDB 默认会将所有的数据库InnoDB引擎的表数据存储在一个共享空间中:ibdata1,这样就感觉不爽,增删数据库的时候,ibdata1文件不会自动收缩,单个数据库的备份也将成为问题。通常只能将数据使用mysqldump 导出,然后再导入解决这个问题。共享表空间在Insert操作上少有优势。其它都没独立表空间表现好。当启用独立表空间时,请合理调整一 下innodb_open_files 的值。
-------------------------------------------------------------------------------
需要说明的是:
1、设置了独立表空间之后,如果改成了共享表空间,那么,此时如果执行表的插入操作,数据会存放在哪里呢?
对于之前已经存在了的表,还是存放在独立表空间。对于新建的表,就会存放在共享表空间了。
2、如果一开始用了独立表空间,后来改了innodb_file_per_table变量的值,改成独立表空间了,那么数据如何存储?
对于已经存在了的innodb引擎的表来说,数据还是存放在共享表空间的,而此时如果创建了新的表,那么就会在数据库的目录中多出一个.ibd的文件用于存储这个新表的数据。
总结上面的1、2,就是:原来的还是按照原来的方式存储。新的表按照新的规则来存储。
mysql怎么建库建表
最简单的创建 MySQL 数据库的语句
在 MySQL 中创建一个名为 test_db 的数据库。在 MySQL 命令行客户端输入 SQL 语句CREATE DATABASE test_db;即可创建一个数据库,输入的 SQL 语句与执行结果如下。
mysql CREATE DATABASE test_db;
Query OK, 1 row affected (0.12 sec);
“Query OK, 1 row affected (0.12 sec);”提示中,“Query OK”表示上面的命令执行成功,“1 row affected”表示操作只影响了数据库中一行的记录,“0.12 sec”则记录了操作执行的时间。
若再次输入CREATE DATABASE test_db;语句,则系统会给出错误提示信息,如下所示:
mysql CREATE DATABASE test_db;
ERROR 1007 (HY000): Can't create database 'test_db'; database exists
提示不能创建“test_db”数据库,数据库已存在。MySQL 不允许在同一系统下创建两个相同名称的数据库。
可以加上IF NOT EXISTS从句,就可以避免类似错误,如下所示:
mysql CREATE DATABASE IF NOT EXISTS test_db;
Query OK, 1 row affected (0.12 sec)
怎么在mysql表中创建分区表
frm表结构文件,myd表数据文件,myi表索引文件。
INNODB engine对应的表物理存储文件
innodb的数据库的物理文件结构为:
.frm文件
.ibd文件和.ibdata文件:
这两种文件都是存放innodb数据的文件,之所以用两种文件来存放innodb的数据,是因为innodb的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。
独享表空间存储方式使用.ibd文件,并且每个表一个ibd文件
共享表空间存储方式使用.ibdata文件,所有表共同使用一个ibdata文件
关于mysql怎么创建表空间和mysql怎么创建表语句的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。