目录
MySQL常用存储引擎之CSV
文件系统的存储特点
CSV存储引擎特点
MySQL环境演示CSV存储引擎的使用
CSV适用场景
CSV存储引擎可以将CSV文件作为MySQL表来处理,这种存储引擎的存储格式的就是普通的CSV文件,CSV存储引擎的数据存储方式非常的有特点。
如果我们把数据存储在MyISAM,或者说InnoDB表中的话,其数据文件我们是不能直接查看的,因为这两种存储引擎的数据存储都是以二进制文件方式来存储的。
而CSV存储引擎则不同,CSV存储引擎的数据格式是以文件方式来进行存储的,也就是说我们可以通过,查看文件的命令more或者vi 工具,直接查看或编辑CSV存储引擎中的表,只要符合CSV文件的格式要求,我们就不用担心损坏数据。
问:当我们在MySQL中建立了一个CSV存储引擎的表时,我们应该可以看到什么?
答:三个文件系统的文件,这三个文件都是以表名为文件名,但是会分别以CSV、CSM和FRM为后缀,启动了CSV文件:
1、最大的特点就是将CSV文件,作为MySQL的表来处理,这种存储的存储格式的就是普通的CSV的文件格式,大家对CSV文件的格式,应该比较熟悉了,这CSV文件的每一列都是以“,”分割的,并且对于文本类型的数据来说,是以双隐号来引起来的。
下图中的内容就是一个很典型的CSV文件的格式了:
2、CSV的第二个特点,是在建立表时所有的列的定义必须都是非空的,也就是说CSV存储引擎的表是不允许出现可为空的列的。
问:CSV和MyISAM、InnoDB存储引擎有什么不同?
答:CSV存储引擎的是不支持索引的,索引的主要作用就是优化查询的效率,如果一个表不支持,所以那么每次查询时的都会进行全表扫描,那么对于一个大表来说,这显然这个查询效率会非常低,所以呢这一点来看,CSV存储引擎并不适用于OLTP环境中的使用,也就是在线处理,像我们一般的web环境是不适合使用CSV存储引擎的。
3、CSV存储引擎是支持对文件系统的数据文件直接进行编辑,这和其他大多数数据库存储引擎的是不同的,其他存储引擎的数据文件的全是以二进制来进行存储的,而CSV存储引擎的数据文件中保存的却是文本文件的内容。
1、在test库中建立CSV存储引擎的表(mycsv)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
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>
场景问题1:在这个表中的我们这三个列都是程序允许为空的,在这种情况下会出现什么问题?
答:报出1178错误,也就是说这个存储引擎是不支持可为空的列的,这也就是我们之前给大家介绍了这个CSV存储引擎特点的时候特别指出的。
2、修改表定义增加表约束
# 修改表 not null
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.04 sec)
# 查看表结构
mysql> show create table mycsv;
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
| mycsv | CREATE TABLE `mycsv` (
`id` int(11) NOT NULL,
`c1` varchar(10) NOT NULL,
`c2` char(20) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=latin1 |
+-------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql>
3、向表插入一些数据查看到存储特性
# 插入数据
mysql> insert into mycsv values(1,'xuhaiyan','ww'),(2,'dengc','dc');
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
# 查询数据
mysql> select * from mycsv;
+----+----------+----+
| id | c1 | c2 |
+----+----------+----+
| 1 | xuhaiyan | ww |
| 2 | dengc | dc |
+----+----------+----+
2 rows in set (0.00 sec)
4、到我们的文件系统中查看文件系统存储特点
# 查询数据存储路径
mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
# 另开一台,进入存储路径查询具体数据文件
[root@localhost test]# cd /var/lib/mysql/test
# 删选只浏览mycsv.*文件
[root@localhost test]# ls -lh mycsv.*
-rw-rw----. 1 mysql mysql 35 2月 20 10:00 mycsv.CSM
-rw-rw----. 1 mysql mysql 33 2月 20 10:00 mycsv.CSV
-rw-rw----. 1 mysql mysql 8.5K 2月 20 09:56 mycsv.frm
5、查看CSV文件的内容【是以文本格式来进行存储】
# 查看以文本格式存储的mycsv.*文件内容
[root@localhost test]# more mycsv.CSV
1,"xuhaiyan","ww"
2,"dengc","dc"
跟我们看在表中插入内容是一样的,我们刚才还说我这个CSV文件的特点,他的这个数据存储文件可以直接进行编辑的。
6、对CSV数据文件进行编辑【注意单双引号严格要求】
[root@localhost test]# vi mycsv.CSV
1,"xuhaiyan","ww"
2,"dengc","dc"
3,"XX","NEW ADD"
~
~
~
~
:wq
在命令行的格式下增加了ID为3的列
7、在Mysql下在SQL语句查询是否有上述结果
mysql> flush tables;
# 查询
mysql> select * from mycsv;
+----+----------+---------+
| id | c1 | c2 |
+----+----------+---------+
| 1 | xuhaiyan | ww |
| 2 | dengc | dc |
| 3 | XX | NEW ADD |
+----+----------+---------+
3 rows in set (0.00 sec)
总结:
上述演示了CSV它可以直接对我们的数据,存储的文件进行编辑,前面的还说过CSV文件存储引擎的是不支持索引的。
问:CSV不支持索引,那么我们在CSV表上建立索引会怎么样呢?
答:
mysql> mysql> create index idx_id on mycsv(id);
ERROR 1069 (42000): Too many keys specified; max 0 keys allowed
mysql>
太多的关键字被指定,仅支持0个关键键,这意味着不支持索引了
根据我们之前,前面的介绍和演示了,我们可以知道,CSV存储引擎可以在数据库运行时,拷贝或者是拷出文件,存储数据的文件,可以将excel电子表格软件中的数据的存储为CSV文件,然后复制到MySQL数据目录下,就能够在MySQL中打开和使用了,如下图所示:
同样的,如果将数据写入到CSV引擎的表中的其他的外部程序呢,也能够立即的从表中数据文件中读取的CSV格式的数据,又是CSV存储引擎,可以作为数据交换空间表来进行使用,这一点都是非常有用的,如下图所示: