与其他数据库软件不同,MySQL数据库软件提供了一个名为存储引擎的概念。由于存储引擎是以插件的形式被MySQL数据库软件引入,所以可以根据实际应用、实际的领域来选择相应的存储引擎。
在MySQL数据库软件中,虽然通过存储引擎决定数据库对象表的类型,但是如果想创建表, 还需要了解数据类型,因为其决定了表中可以存储数据的类型。
存储引擎是MySQL数据库管理系统的一个重要特征,在具体开发时,为了提髙MySQL数据库管理系统的使用效率和灵活性,可以根据实际需要来选择存储引擎。因为存储引擎指定了表的类型,即如何存储和索引数据、是否支持事务等,同时存储引擎也决定了表在计算机中的存储方式。
1.1 MySQL5.6所支持的存储引擎
用户在选择存储引擎之前,首先需要确定数据库管理系统支持哪些存储引擎。查看帮助文档发现在MySQL数据库管理系统中査看支持的存储引擎通过SQL语句SHOW ENGINES来实现,其语法形式如下:
SHOW ENGINES;
在上述语句中可以实现查看当前MySQL数据库管理系统所支持的存储引擎。
执行结果显示,MySQL5.6支持9种存储引擎,分别为FEDERATED 、MRG_MYISAM、MyISAM、 BLACKHOLE、CSV、MEMORY、ARCHIVE、Inno和 PERFORMANCE_SCHEMA。
其中 Engine 参数表示存储引擎名称;Support参数表示MySQL数据库管理系统是否支持该存储引擎,其中值YES表示支持,值No表示不支持,值DEFAULT表示该存储引擎是数据库管理系统默认支持的存储引擎;Comment参数表示关于存储引擎的评论;Transactions参数表示存储引擎是否支持事务,其中值YES表示支持,而值NO表示不支持;XA参数表示存储引擎所支持的分布式是否符合XA规范,其中值YES表示支持,而值NO表示不支持;Savepoints参数表示存储引擎是否支持事物处理中的保存点,其中值YES表示支持,而值NO表示不支持。
注意:通过执行结果可以发现,MySQL5.6数据库管理系默认的存储引擎为InnoDB存储引擎.
在具体执行SQL语句中,可以用“;”、“\g”和“\G”符号表示语句结束。其中前两个符号的作用一样,而最后一个符号除了表示语句结束外,还可以使得结果显示的更加美观。执行SQL语句show engines;以“;”或者“\g”作为结束符号査看存储引擎,具体SQL语句如下:
SHOW ENGINES;
或者
SHOW ENGINES\g;
1.2 操作默认存储引擎
查看帮助文档可以发现,安装版MySQL5.6数据库管理系统的默认存储引擎为InnoDB。
1、查询默认存储引擎
如果需要操作默认存储引擎,首先需要查看默认存储引擎。那么如何查看默认存储引擎呢?可以通过执行show variables来查看馱认的存储引擎,具体SQL语句如下:
SHOW VARIABLES LIKE 'storage_engine%';
上述命令中,设置关键字like,关键字为“storage_engine %”,表示查询默认存储引擎。 执行
2、修改默认存储引擎
在MySQL数据库管理系统中,如果需要修改默认存储引擎,可以通过手动修改配置文件方式。
通过手动方式来修改馱认存储引擎时,需要修改MySQL数据库管理系统的配罝文件my.ini,具体步骤如下:
(1) 首先打my.ini配置文件,关于“[mysqld]”组的内容如下:
如果想修改默认存储引準,只需修改[mysqld]组中的default-storage-engine=INNODB参数。即如果想设置默认存储引擎为MyISAM,只需修改成“default-storage-engine= MyISAM”即可实现。
注意:如果想使修改后的参数生效,须重新启动MySQL服务.
(2) 重启MySQL服务后,这时再次执行SQL语句show variables来查看默认的存储引擎,具体SQL语句如下:
SHOW VARIABLES LIKE 'storage_engine%';
1.3 选择存储引擎
在具体使用MySQL数据库管理系统时,选择一个合适的存储引擎是一个非常复杂的问题。因为每种存储引擎都有自己的特性、优势和应用场合,所以不能随便选择存储引擎。为了能够正确地选择存储引擎,必须掌握各种存储引擎的特性。
下面重点介绍几种常用的存储引擎,它们对各种特性的支持如下表所示。
表 存储引擎特性
特性 |
MylSAM |
lnnoDB |
MEMORY |
存储限制 |
有 |
64TB |
有 |
事务安全 |
不支持 |
支持 |
不支持 |
锁机制 |
表锁 |
行锁 |
表锁 |
B树索引 |
支待 |
支持 |
支持 |
哈希索引 |
不支持 |
不支持 |
支持 |
全文索引 |
支持 |
不支持 |
不支持 |
集群索引 |
不支持 |
支持 |
不支持 |
数据缓存 |
支持 |
支持 |
|
索引缓存 |
支持 |
支持 |
支持 |
数据可压缩 |
支持 |
不支持 |
不支持 |
空间使用 |
低 |
高 |
N/A |
内存使用 |
低 |
高 |
中等 |
批量插入的速度 |
高 |
低 |
高 |
支持外键 |
不支持 |
不支持 |
不支持 |
表主要介绍了 MylSAM、InnoDB和MEMORY三种存储引擎特性的对比,接下来将详细介绍这3个存储引擎的应用场合并给出相应的建议。
●MyISAM存储引擎:由于该存储引擎不支持事务、也不支持外键,所以访问速度比较快。因此对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。
●InnoDB存储引擎:由于该存储引擎在事务上具有优势,即支持具有提交、回滚和崩溃恢复能力的事务安装,所以比MylSAM存储引擎占用更多的磁盘空间。因此需要进行频繁的更新、删除操作,同时还对事务的完整性要求比较髙,需要实现并发控制,此时适合使用该存储引擎。
●MEMORY存储引擎:该存储引擎使用内存来存储数据,因此该存储引擎的数据访问速度快, 但是安全上没有保障。如果应用中涉及数据比较小,需要进行快速访问,则适合使用该存储引擎.
在MySQL数据库管理系统中,可以通过存储引擎来决定表的类型,即其决定了表的存储方式。同时MySQL数据库管理系统也提供了数据类型决定表存储数据的类型。MySQL数据库管理系统提供了整数类型、浮点数类型、定点数类型和位类型、日期和时间类型、字符串类型。
2.1 整数类型
MySQL数据库管理系统除了支持标准SQL中的所有整数类型(smallint和int),还进行了相应扩展。扩展后增加了tinyint、mediumint和bigint这三个整数类型。
下表通过展示各种整数类型的特性,其中int与integer这两个整数类型是同名词(可以相互替换),具体内容如下。
表 整数类型
整数类型 |
宇节 |
最小值 |
最大值 |
TINYINT |
1 |
有符号-128 无符号0 |
有符号127 无符号255 |
SMALUNT |
2 |
有符号-32768 无符号0 |
有符号32767 无符号65535 |
MEDIUMINT |
3 |
有符号-8388608 无符号0 |
有符号8388607 无符号1677215 |
INT 和 INTEGER |
4 |
有符号-2147483648 无符号0 |
有符号 2147483647 无符号 4294967295 |
BIGINT |
8 |
有符号-922337203685477580无符号0 |
有符号 9223372036854775807 无符号 18446744073709551615 |
表中内容显示,tinyint类型占用字节数最小,只需1字节,因此该类型的取值范围最小。bigint类型占用字节数最大,需要8个字节,因此该类型的取值范围最大。
注意:为什么要了解整数类型所占的字节数?因为根据数据类型所占的字节数可以算出该类型的取值范围。
在计算机中所有的内容都存储为不同组合的二进制码(0和1),整数类型数据也不例外,只不过整数是有符号数(正负数),因此其左边的第一位为符号位(0为正数,1为负数)。例如,tinyint 类型占1字节(1字节=8位),所以该类型数据的最大值二进制如下图1所示,最小值二进制如图2所示,
图1 正整数最大值二进制表示
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
图2 负整数最小值二进制表示
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
对于上图1所示的二进制数,转换成十进制数为27-1,即127。对于图2所示的二进制数,转换成十进制数为-27,即-128。
在具体使用MySQL数据库管理系统时,如果需要存储整数类型数据,则可以选择tinyint、 smallint、mediumint、int、integer和bigint类型,至于选择这些类型中的哪一个,首先霜要判断存储整数数据的取值范围,当不超过255时,那选择tinyint类型就足够了。虽然bigint类型的取值范围最大,最常用的整数类型却是int类型。
如果无法区分各个整数类型的表示范围,可以通过查看MySQL的系统帮助查看相关信息。查看系统帮助的方法如下所示。
2.2 浮点数类型、定点数类型和位类型
MySQL数据库管理系统除了支持标准SQL中的所有浮点数类型(float和double)、定点数类型(decimal)外,还进行了相应扩展。扩展后增加了位类型(bit)。
下面通过表展示各种浮点数类型的特性,具体内容如下《
表 浮点数类型
浮点数类型 |
字节 |
最小值 |
m大值 |
FLOAT |
4 |
± 1.7S4943S1E - 38 |
±3.402823466E+38 |
DOUBLE |
8 |
± 2.22S073SS8S072014E - 308 |
± 1.797693I348623157E + 308 |
上表中内容显示,float类型占用字节数为4,该类型的取值范圃最小,double类型占用字节数为8,该类型的取值范围最大。
在具体使用MySQL数据库管理系统时,如果需要存储小数数据,则可以选择float和 double类型,至于选择这两个类型中的哪-个,则需要判断存储小数数据需要精确的小数位数,当需要精确到小数点后10位以上,就需要选择double类型。 下面通过表展示定点数类型的特性,具体内容如下。
表4.4定点数类型
定点数类型 |
字节 |
最小值 |
最大值 |
DEC(M,D) DECIMAL(M,D) |
M+2 |
与double相同 |
与double相同 |
上表中内容显示,其中DEC、DECIMAL这两个定点数类型是同名词,该类型的取值范围与double类型相同,但是其有效取值范围由M和D来决定。
在具体使用MySQL数据库管理系统时,如果需要存储小数数据,除了可以选择float和double类型外,还可以选择dec和decimal类型,当要求小数数据精确度非常高时,则可以选择dec和decimal类型,它们的精确度比double类型还要高。
Float、double数据类型存储数据时存储的是近似值,而decimal存储的是字符串,因此提供了更高的精度,在需要表示金额等货币类型时优先选择decimal数据类型。下面通过表展示位类型的特性,具体内容如下。
表 位类型
位类型 |
字节 |
最小值 |
最大值 |
Bit(M) |
1~8 |
Bit(1) |
Bit(64) |
表内容显示,位类型bit的字节数是M,M的取值范围为1〜8,即该类型的存储空间是根据其精度决定的。
2.3 日期和时间类型
MySQL数据库管理系统中有多种表示曰期和时间的数据类型,各种版本有微小的差异,下面通过表展示数据库管理系统所支持日期和时间类型的特性,具体内容如下。
表 日期和时间类型
日期和时间类型 |
字节 |
最小值 |
•大值 |
DATE |
4 |
1000-01-01 |
9999-12-31 |
DATETIME |
8 |
1000-01~0l 00:00:00 |
9999-12-31 23:59:59 |
TIMESTAMP |
4 |
19700101080001 |
2038年的某个时刻 |
TIME |
3 |
-835:59:59 |
838:59:59 |
YEAR |
1 |
1901 |
2155 |
表中内容显示,每种日期和时间数据类型都有一个取值范围,如果插入的值超过了该类型的取值范围,则会插入默认值。
在具体应用中,各种日期和时间类型的应用场合如下:
•如果要表示年月日,一般会使用date类型。
•如果要表示年月日时分秒,一般会使用datetime类型。
•如果需要经常插入或者更新日期为当前系统时间,一般会使用timestamp类型
•如果要表示时分秒,一般会使用time类型。
•如果要表示年份,一般会使用year类型。因为该类型比date类型占用更少的空间。
在具体使用MySQL数据库管理系统时,要根据实际应用来选择满足需求的最小存储的日期类。例如,如果应用只需存储“年份”,则可以选择存储字节为1的year类型。如果要存储年月日时分秒,并且年份的取值可能比较久远,最好使用datetime类型,而不是timestamp类型, 因为前者比后者所表示的日期范围要长一些。如果存储的日期需要让不同时区的用户使用,则可以使用timestamp类型,因为只有该类型日期能够与实际时区相对应。
2.4 字符串类型
MySQL数据库管理系统中有多种表示字符串的数据类型,各种版本有微小的差异,下面通过表展示数据库管理系统所支持的char系列字符串类型的特性,具体内容如下。
表 char系列字符串类型
char系列字符串类型 |
字节 |
描述 |
CHAR(M) |
M |
M为0-255之间的整数 |
VARCHAR(M) |
M |
M为0-65535之间的整数 |
表中内容显示,字符串类型char的字节数是M,例如char(4)的数据类型为char,其最大长度为4个字节。varchar类型的长度是可变的,其长度的范围为0〜65535。
在具体使用MySQL数据库管理系统时,如果需要存储少量字符串,则可以选择char和varchar类型,至于是选择这两个类型中的哪一个,则需要判断所存储字符串长度是否经常变化,如果经常发生变化,则可以选择varchar类型,否则选择char类型。
下面通过表展示数据库管理系统所支持的TEXT系列类型字符串的特性,具体内容如下。
表 text系列字符串类型
TEXT系列字符串类型 |
字节 |
描述 |
TINYTEXT |
0-255 |
值的长度为+2个宇节 |
TEXT |
0-65535 |
值的长度为+2个字节 |
MEDIUMTEXT |
0-167 772 150 |
值的长度为+3个字节 |
LONGTEXT |
0~4 294 967 295 |
值的长度为+4个字节 |
表中内容显示,text系列中的各种字符串类型允许的长度和存储字节不同,其中tinytext字符串类型允许存储字符串长度最小,longtext字符串类型允许存储字符串长度最大。
表 binary系列字符串类型
binary系列字符串类型 |
字节 |
描述 |
Binary(M) |
M |
允许长度为0~M |
Varbinary(M) |
M |
允许长度为0~M |
表中的binary和varbinary两个类型,与char系列字符串中的char和varchar非常类似,不同的是,前者可以存储二进制数据(例如图片、音乐或者视频文件),而后者只能存储字符数据
在具体使用MySQL数据库管理系统时,如果需要存储大量字符串(存储文章内容的纯文本), 则可以选择binary系列字符串类型。至于是选择这些类型中的哪一个,则需要判断所存储字符串长度是否经常变化。如果经常变化选择varbinary否则选择binary类型。
下面通过表展示数据库管理系统所支持的BLOB系列字符串类型的特性,具体内容如下。
表 blob系列字符串类型
BLOB系列字符串类型 |
字节 |
TINYBLOB |
0-255 |
BLOB |
0-216 |
MEDIUMBLOB |
0-224 |
LONGBLOB |
0-232 |
表内容中的四个类型,与text系列字符串类型非常类似,不同的是,前者可以存储二进制数据(例如图片、音乐或者视频文件),而后者只能存储字符数据。
在具体使用MySQL数据库管理系统时,如果需要存储大量二进制数据(存储电影等视频文件), 则可以选择blob系列字符串类型。至于是选择这些类型中的哪一个,则需要判断所存储二进制数据长度,根据存储二进制数据的长度来决定是选择允许长度最小的tinyblob字符串类型,还是选择允许长度最大的longblob字符串类型。