今天来分享一下MySQL中支持的一种存储引擎–CSV,这种存储引擎平时工作中用得可能并不多,但是在某一些导入CSV文件的场景下,非常有用;下面我们就来具体介绍下该存储引擎的使用;
平时我们把CSV文件导入到MySQL中,可能会考虑到使用load data的方式导入数据,下面我们介绍一种新的方式–使用CSV引擎,在数据量比较大的情况下,非常的好用;
CVS引擎MySQL默认就是支持的,可以通过如下的方式进行查看:
mysql>show engines; +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | ROCKSDB | YES | RocksDB storage engine | YES | YES | YES | | InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+ 10 rows in set (0.00 sec)
MySQL CSV存储引擎可以将csv文件作为mysql的表进行处理。存储格式就是普通的csv文件。
文件系统存储特点
数据以文本方式存储在文件中(Innodb则是二进制)
.CSV文件存储表内容
.CSM文件存储表的元数据如表状态和数据量
.frm文件存储表结构信息
如果是8.0版本,没有.frm文件,而是.sdi文件
CSV引擎限制
- 以CSV格式进行数据存储(逗号隔开,引号)
- 所有的列必须都是不能为NULL的
- 不支持索引(不适合大表,不适合在线处理)
- CSV存储引擎不支持分区。
- 可以对数据文件直接编辑(保存文本文件内容)
测试案例
我们新建一个csv文件,但是不指定not null
mysql> create table mycsv(id int,c1 varchar(10),c2 char(20)) engine=csv; ERROR 1178 (42000): The storage engine for the table doesn't support nullable columns
我们指定各列不为空
mysql> create table mycsv(id int not null ,c1 varchar(10) not null,c2 char(20) not null) engine=csv; Query OK, 0 rows affected (0.02 sec)
向表中插入数据
mysql> insert into mycsv values ( 1,'aaa','bbb'),(2,'ccc','ddd') ; Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> select * from mycsv; +----+-----+-----+ | id | c1 | c2 | +----+-----+-----+ | 1 | aaa | bbb | | 2 | ccc | ddd | +----+-----+-----+ 2 rows in set (0.01 sec)
我们查看文件系统下的文件
-rw-r----- 1 mysql mysql 3110 Nov 19 16:56 mycsv_750.sdi -rw-r----- 1 mysql mysql 35 Nov 19 16:56 mycsv.CSM -rw-r----- 1 mysql mysql 28 Nov 19 16:56 mycsv.CSV
查看CSV文件
# cat mycsv.CSV 1,"aaa","bbb" 2,"ccc","ddd"
我们发现就是文本文件
我们对文本文件进行编辑
1,"aaa","bbb" 2,"ccc","ddd" 3,"222","ddd" 4,"111","ddd"
然后在数据库中查看表
首先刷新数据表
mysql> flush tables; Query OK, 0 rows affected (0.05 sec)
查看数据表
mysql> select * from mycsv; +----+-----+-----+ | id | c1 | c2 | +----+-----+-----+ | 1 | aaa | bbb | | 2 | ccc | ddd | | 3 | eee | fff | +----+-----+-----+ 3 rows in set (0.00 sec)
我们发现在文件中修改的数据已经添加到了数据库
我们看看如果增加索引会发生什么
mysql> create index idx_id on mycsv(id); ERROR 1069 (42000): Too many keys specified; max 0 keys allowed
证明不支持索引
好了,今天就先介绍这些;