目录
一. MySQL存储引擎
1.MySQL存储引擎
查看当前MySQL数据库支持的存储引擎的方法:
show engines命令
SHOW ENGINES;或SHOW ENGINES \G
“\g”或“\G”作用与分号作用相同,”\G”可以让结果更加美观。
show variables like 'have%'
show variables like 'have%'\G
InnoDB存储引擎:
为处理巨大数据量时的最大性能设计。
完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。
是事务(Transaction)安全的,并且支持外键(foreign key)。
InnoDB表空间分为共享表空间与独享表空间。其中,表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。
MyISAM存储引擎:
是默认存储引擎,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法。
MyISAM具有检查和修复表格的大多数工具。
MyISAM表格可以被压缩,而且它们支持全文搜索。
它们不是事务安全的,而且也不支持外键。
如果事务回滚将造成不完全回滚,不具有原子性。
如果执行大量的查询操作时,MyISAM是更好的选择。
MEMORY存储引擎:
将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。
非常适合用于存储临时数据的临时表,以及数据仓库中的纬度表。
默认使用哈希(HASH)索引,而不是B+树索引。
速度非常快,但在使用上还是有一定的限制:只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。最重要的是,存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存。
MERGE存储引擎:
是一组MyISAM表的组合,这些MyISAM表必须结构完全相同。
MERGE表本身没有数据,对MERGE类型的表可以进行查询、更新、删除操作,实际上是对内部的**MyISAM表**进行的。
对MERGE表进行DROP操作,这个操作只是删除MERGE的定义,对内部的表没有任何影响。
2.MySQL中的其他存储引擎
(1)BLACKHOLE存储引擎
使用场合:
验证存储文件语法的正确性
来自二进制日志记录的开销测量,通过比较,允许二进制日志功能的BLACKHOLE的性能与禁止二进制日志功能的BLACKHOLE的性能。
被用来查找与存储和引擎自身不相关的性能瓶颈。
(2)CSV存储引擎
起主要用途就是通过数据库中的数据导出成一份报表文件。
(3)ARCHIVE存储引擎
ARCHIVE 存储引擎主要用于通过较小的存储空间来存放过期的很少访问的历史数据。
3.MySQL存储引擎的选择
(1)MyISAM
适用场景是不需要事务支持、并发相对较低、数据修改相对较少、以读为主、数据一致性要求不是非常高。
(2)InnoDB
适用场景是需要事务支持、行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成、数据更新较为频繁。
(3)MEMORY
适用场景是需要很快的读写速度、对数据的安全性要求较低。
MEMORY存储引擎对表的大小有要求,不能是太大的表。
4.MySQL字符集
字符集:一套文字符号及其编码、比较规则的集合。
MySQL支持的字符集:
默认是latin1(西欧ISO_8859_1字符集的别名)
latin1字符集是单字符编码,而汉字是双字节编码,由此可能导致MySQL数据库不支持中文字符查询或者中文字符乱码等问题。
MySQL服务器可以支持多种字符集,在同一台服务器、同一个数据库甚至同一个表的不同字段都可以使用相同的字符集。
查看字符集的两种方式:
show character set;
•使用**information_schema.character_sets**,可以显示所有的字符集和该字符集默认校对规则。
MySQL字符集包括字符集和校对规则两个概念。
字符集用来定义MySQL存储字符串的方式。
校对规则定义比较字符串的方式。
字符集和校对规则是一对多的关系,两个不同的字符集不能有相同的校对规则,每个字符集有一个默认校对规则。
MySQL支持30多种字符集的70多种校对规则。每个字符集至少对应一个校对规则。
查看相关字符集的校对规则的方法:
•通过
SHOW COLLATION LIKE '***';
命令。
•通过系统表information_schema.COLLATIONS来查看。
Empty set(0.00sec)表示提示你实体表为空,说的是你的数据库或表里数据为空,你添加上数据就能够了。
5.选择MySQL字符集的考虑因素:
(1) 满足应用支持语言的要求,如果应用要处理的语言种类多,要在不同语言的国家发布,就应该选择Unicode字符集,就目前对MySQL来说,选择utf-8。
(2) 如果应用中涉及已有数据的导入,就要充分考虑数据库字符集对已有数据的兼容性。假若已经有数据是GBK文字,如果选择uft-8作为数据库字符集,就会出现汉字无法正确导入或显示的问题。
(3) 如果数据库只需要支持一般中文,数据量很大,性能要求也很高,那就应该选择双字GBK。因为,相对于UTF-8而言,GBK比较“小”,每个汉字占用2个字节,而UTF-8汉字编码需要3个字节,这样可以减少磁盘I/O、数据库Cache以及网络传输的时间。如果主要处理的英文字符,只要少量汉字,那么选择UTF-8比较好。
(4) 如果数据库需要做大量的字符运算,如比较、排序等,那么选择定长字符集可能更好,因为定常字符集的处理速度要比变长字符集的处理速度快。
(5) 考虑客户端所使用的字符集编码格式,如果所有客户端都支持相同的字符集,则应该优先选择字符集作为数据库字符集。这样可以比避免因字符集转化带来的性能开销和数据损失。
6.MySQL字符集的设置
MySQL的字符集和校对规则有4个级别的默认设置:
服务器级字符集和校对规则
数据库级字符集和校对规则
表级字符集和校对规则
字段级字符集和校对规则
7.服务器级字符集和校对规则
查询当前的服务器的字符集:
使用命令。
show variables like 'character_set_server'
查看校对规则:
使用命令。
show variables like 'collation_server';
服务器字符集和校对规则,可以在MySQL服务启动的时候确定。
例:若要指定字符集为gbk(校验规则为与其对应的默认的校验规则)
在my.cnf配置文件中设置:
[mysqld] character-set-server=gbk;
在启动时指定字符集为gbk,命令如下:
mysqld –character-set-server=gbk
数据库的字符集和校验规则在创建数据库的时候指定,也可以在创建完数据库后通过''**alter database”命令进行修改**。''
如果数据库中已经存在数据,因为修改字符集并不能将已有的数据按照新的字符集进行存放,所以不能通过修改数据库的字符集直接修改数据的内容。
显示当前数据库字符集和校验规则可用以下两条命名分别查看:
show variables like 'character_set_database '
show variables like 'collation_database'
设置的规则:
如果指定了字符集和校对规则,则使用指定的字符集和校对规则:
如果指定了字符集没有指定校对规则,则使用指定字符集的默认校对规则;
如果指定了校对规则但未指定字符集,则字符集使用与该校对规则关联的字符集;
如果没有指定字符集和校对规则,则使用服务器字符集和校对规则作为数据库的字符和校对规则。
8.表字符集和校验规则
在创建表的时候指定
可以通过alter table命令进行修改
如果表中已有记录,修改字符集对原有的记录并没有影响,不会按照新的字符集进行存放。
要显示当前表字符集和校验规则可用以下如下命名查看:
show create table 表名;
9.列字符集和校验规则
MySQL可以定义列级别的字符集和校对规则,主要是针对相同的表不同字段需要使用不同的字符集的情况。
列字符集和校对规则的定义可以在创建表时指定,或者在修改表时调整,如果在创建表的时候没有特别指定字符集和校对规则,则默认使用表的字符集和校对规则。
10.连接字符集和校验规则
客户端和服务器之间交互的字符集和校对规则的设置。
MySQL提供了3个不同的参数:character_set_client、character_set_connection和character_set_results,分别代表客户端、连接和返回结果的字符集。通常情况下,这3个字符集应该是相同的,才可以确保用户写入的数据可以正确地读出,特别是对于中文字符,不同的写入字符集和返回结果字符集将导致写入的记录不能正确读出。
同时修改这3个参数的值:set names ***;命令
在my.cnf中设置一下语句
[mysql]
default-character-set=gbk;
二.MySQL数据库操作管理
1.创建数据库
创建数据库是通过SQL语句CREATE DATABASE或CREATE SCHEMA命令来实现的。
每一个数据库都有一个数据库字符集和一个数据校验规则,不能够为空。
语法格式:
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS ]db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
数据库名:在文件系统中,MySQL的数据库存储区将以目录方式表示MySQL数据库。因此,命令中的数据库名字必须符合操作系统文件夹命名规则。
在MySQL中不区分大小写,在一定程度上方便使用。
如果指定了CHARACTER SET charset_name 和COLLATE collation_name,那么采用指定的字符集charset_name和校验规则collation_name,如果没有指定,那么会采用默认的值。
查看所有的数据库:
使用SHOW DATABASES;命令。
查看数据库的详细信息:
show create database 数据库名称 \G
使用某个数据库:
使用USE db_name;命令。
2.修改数据库名称
如果MySQL数据库的存储引擎是MyISAM,那么只要修改DATA目录下的库名文件夹就可以了。
如果存储引擎是InnoDB,是无法修改数据库名称的,只能修改字符集和校对规则。
语法格式:
ALTER {DATABASE | SCHEMA} [db_name]
[DEFAULT CHARACTER SET charset_name]
| [[DEFAULT] COLLATE collation_name]
说明:
ALTER DATABASE用于更改数据库的全局特性,用户必须有数据库修改权限,才可以使用ALTER DATABASE修改数据库。
3.删除数据库
删除数据库是指在数据库系统删除已经存在的数据库,删除数据库成功后,原来分配的空间将被收回。在删除数据库时,会删除数据库中的所有的表和所有的数据,因此,删除数据库时需要慎重考虑。
如果要删除某个数据库,可以先将该数据库备份,然后再进行删除。
删除数据库语法格式:
DROP DATABASE [IF EXISTS] db_name;