一,数据库引擎:数据库存储和处理数据的核心服务
查看mysql支持的引擎:

SHOW ENGINES;

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_MySQL


可以看到画红线的部分都是MySQL支持的引擎,二绿线的InnoDB是默认的引擎。那为什么默认的引擎是innodb?打开MySQL,找到my.ini文档,里面的默认引擎是innodb。

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_f5_02


二,不同的数据库引擎的性能是不一样的。

我们都知道创建一个数据库就是创建了一个文件夹

创建一张表会创建什么呢?

在myisam引擎下创建表会生成3个文件

把f3的引擎修改成myisam

CREATE TABLE f3(
     d INT,
     s VARCHAR(20)
      )ENGINE MYISAM

修改完引擎之后,我们发现在MySQL中的xx表下多了三个f3文件

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_数据_03


Frm:存储的是表结构信息

Myd: 存放的是数据

Myi: 存放的是索引

我们给f3表里面批量添加数据

INSERT INTO f3(SELECT * FROM f3)

我们发现f3.myd文件里面的数据增长了,并且添加速度非常快

DELETE FROM f3

我们再删除f3里面的数据,发现f3.myd文件里面的数据不见了,并且删除速度非常快。由此我们发现myisam引擎下,表结构信息,表数据,索引是分开存放的。
三,我们用innodb引擎
默认的引擎就是innodb,但是我们还可以在后面追加引擎。
1,创建f5表

CREATE TABLE f5(
     d INT,
     s VARCHAR(20)
      )

2,追加引擎:

ALTER TABLE f5 TYPE=INNODB

在innodb下创建表,此时我们发现只生成了一个文件
MySQL>data>xx>f5.frm,默认大小9KB
Frm:存储的是表结构信息
3,添加数据:

INSERT INTO f5 VALUES(1,'a')
INSERT INTO f5(SELECT * FROM f5)

添加数据后我们发现f5.frm没有增大,此时的数据存哪去了?
此时数据和索引存储在了一个叫ibdata1的文件下,这个ibdata1文件是被所有被innodb引擎修饰的表共享的一个文件
mysql>data>ibdata1
然后我们删除数据:

DELETE FROM f5

发现ibdata1反而变大了,不仅没有删除,反而变大了。原因是删除数据的时候,反而增加了一些数据去记录这些被删除的数据。所以ibdata1文件只增不减
我们如果把这个数据库干掉了?

DROP DATABASE xx

发现数据文件大小还是没有变,所以这是很危险的,如果一直这样下去,你的磁盘会撑爆的,但是重要数据你又不能删库跑路。
这个时候,我们需要定期执行

OPTIMIZE TABLE +表名

OPTIMIZE TABLE +表名: 清理表里面的垃圾碎片

运行结果:

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_MySQL_04


此时我们发现,文件大小还是没有变。

发现ibdata1文件还清理不了,原因是ibdata1文件是被共享的,叫做共享表空间,而OPTIMIZE TABLE +表名只能操作独立表空间

四,这个时候我们就需要引擎独立空间设置

1,关闭MySQL

2,在my.ini文件下找到[mysql],在后面加上一句话innodb_file_per_table

3,重启MySQL

4,查看独立表空间是否这只ok

SHOW VARIABLES LIKE '%per_table%'

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_设置mysql表的引擎支持降序索引_05


这样代表还是共享表空间。

原因是这也要改

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_MySQL_06


改完就好了

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_f5_07


此时生成两个文件

设置mysql表的引擎支持降序索引 mysql数据库引擎设置_f5_08


然后你再给表里添加数据你就会发现此时ibdata1文件不再增了,而是独立表空间下zyy.idb文件增加,当你删除数据后在OPTIMIZE TABLE +表名,zyy.idb文件又会变小

五,数据库三大范式(范式就相当一门艺术,跟着感觉走,偶尔也可以逆范式)

1nf:表中的字段不可再分,保持原子性,比如时间4.5-6.5,可以分成4月5和6月6

2nf: 先满足1nf,表中不能出现局部依赖(非主键列必须完全依赖与主键的个个列(复合主键))

3nf:先满足2nf,表中的非主键字段必须完全只能依靠主键列,不能在依靠其它非主键列

**###**如果没有满足这些方式就会出现表中表,设计表的初衷要是纯粹的,一个表就描述一个实体