前言:
在日常工作中经常接触到MYSQL数据库,经过了大量实践之后,感觉知识点不够系统,于是通过理论来夯实一下知识体系,故撰此博文,总结和分享常用的知识点。
Mysql是一种关系型数据库。
总的来说 MySQL 主要有以下特性。
(1)速度,运行速度快
(2)价格,MySQL 对多数个人用户来说是免费的
(3)容易使用,与其他大型数据库的设置和管理相比,其复杂程度较低,易于学习
(4)可移植性,能够工作在众多不同的系统平台上 例如 Windows Linux, UNIX Mac OS
(5)丰富的接口,提供了用于 ++、 iffel Java Perl PHP Python Ruby Tel API
(6)支持查询语言,MySQL 可以利用标准 SQL 语法编写支持 ODBC (开放式数据库连接〉的应用程序
(7)安全性和连接性:十分灵活和安全的权限和密码系统,允许基于主机的验证。当连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全 由于 MySQL 是网络化的,因此可以在因特网上的任何地方访问,提高了数据共享的效率。
了解 MySQL必须牢牢记住其体系结构图, MySQL 是由 SQL 接口解析器、优化器、缓存 存储引擎组成的如图所示。
体系结构中各个结构的含义如下
(1)Connectors 指的是不同语言中与 SQL 的交互
(2)Enterprise Management Services & Utilities 系统管理和控制工具。
(3)Connection Pool 连接池 管理缓冲用户连接 线程处理等需要缓存的需求。
(4)SQL Interface: SQL 接口 接受用户的 SQL 命令 并且返回用户需要查询的结果。例如 SELECT FROM 就是调用 SQL Interface
(5)Parser:解析器。在 SQL 命令传递到解析器的时候会被解析器验证和解析 是由 Lex YACC 实现的 个很长的脚本
要功能如下:
数据库存储引擎是数据库底层软件组件,数据库管理系统(DBMS )使用数据引擎进行创建、查询、更新和删除数据的操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统支持多种数据引擎。 MySQL 的核心就是存储引擎。
MySQL 提供了多种不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL中不需要在整个服务器中使用同一种存储引擎,可以针对具体的要求对每一个表使用不同的存储引擎。MSQL 支持的存储引擎有InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE等。
用户可以使用 SHOW ENGINES 语句查看系统支持的引擎类型。
InnoDB 是事务型数据库的首选引擎,支持事务安全表( ACID ),支持行锁定和外键 MySQL 的默认
存储引擎为 InnoDB, InnoDB 的主要特点如下:
(1)、InnoDB MySQL 提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID 兼容)存储引擎。InnoDB 锁定在行级,并且也用 SELECT 语旬提供个类似 Oracle 的非锁定读。这些功能增加了多用户部署和性能 SQL 查询中可以自由地将 InnoDB 类型的表与 MySQL 其他类型的表混合起来,甚至在同一个查询中也可以混合。
(2) 、InnoDB 是为处理巨大数据量时的最大性能设计,它的 CPU 效率可能是任何其他基于碰盘的关系数据库引擎所不能匹敌的。
(3) InnoDB 存储引擎被完全与 MySQL 服务器整合,InnoDB 存储引 擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB 的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始碰盘分区)。这与 MyISAM 表不同,比如在 MyISAM 表中每个表被保存在分离的文件中。 InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为 2GB 的操作系统上。
(4) InnoDB支持外键完整性约束(FOREIGN KEY )。在存储表中的数据时每张表的存储都按主键顺序存放,如果没有显式地在定义表时指定主键,lnnoDB 会为每一行生成一个6字节的 ROWID ,并以此作为主键。
( 5) InnoDB 被用来在众多需要高性能的大型数据库站点上。InnoDB 不创建目录,在使用 InnoDB时MySQL 将在 MySQL 数据目录下创建一个名为 ibdatal的10MB大小的自动扩展数据文件,以及两个名为
ib_logfile()和ib_logfilel 的5MB大小的曰志文件。
My ISAM 基于 ISAM 存储引擎,并对其进行扩展。它是在 Web 、数据仓储和其他应用环境下最常使用的存储引擎之一。 MyISAM 拥有较高的插 、查询速度,但不支持事务。 MyISAM 的主要特点如下:
(1)大文件(达 63 位文件长度)在支持大文件的文件系统和操作系统上被支持。
(2)当把删除、更新及插入混合的时候,动态尺寸的行的碎片更少,这要通过合并相邻被删除的块来完成,若下一个块被删除,则扩展到下一块自动完成。
(3)每个MyISAM 表的最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16个。
(4)最大的键长度是 1000 字节,这也可以通过编译来改变。对于键长度超过250字节的情况,使用一个超过1024字节的键块。
(5)BLOB和TEXT 列可以被索引。
(6)NULL 被允许在索引的列中,其占每个键的0~1字节。
(7)所有数字键值先以高字节位被存储,以允许一个更高的索引压缩。
(8)对于每个表的 AUTO_INCREMENT列,MyISAM 通过INSERT和UPDATE操作自动更新这一列,这使得 AUTO_INCREMENT列更快(至少10%)。注意,在序列项的值被删除之后就不能再利用。
(9)可以把数据文件和索引文件放在不同目录。
(10)每个字符列可以有不同的字符集;
(11)有VARCHAR的表可以有固定或动态记录长度;
(12)VARCHAR和CHAR列可以多达64KB。
使用 MyISAM引擎创建数据库将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型。
frm文件存储表定义,数据文件的扩展名为.myd(MYData),索引文件的扩展名为.myi (MYindex)
MEMORY 存储引擎将表中的数据存储在内存中,为查询和引用其他表中的数据提供快速访问。
MEMORY 的主要特点如下:
(1)MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度;
(2)MEMORY存储引擎执行HASH和BTREE索引;
(3)可以在一个MEMORY表中有非唯一键;
(4)MEMORY 表使用一个固定的记录长度格式;
(5)MEMORY 不支持BLOB或TEXT;
(6)MEMORY 支持 AUTO_INCREMENT列和对可包含NULL值的列的索引;
(7)MEMORY 表在所有客户端之间共享(就像其他任何非 TEMPORARY 表〉;
(8)队在EMORY 表内容被存在内存中,内存是MEMORY表和服务器在查询处理的空闲中创建的内部表共享;
(9)当不再需要MEMORY表的内容时要释放被MEMORY 表使用的内存,应该执行 DELETE FROM
TRUNCATE TABLE ,或者整个地删除表(使用 DROP TABLE)
不同的存储引擎有不同的特点,适用于不同的需求,为了做出正确的选择,用户首先需要考虑每个存储引擎提供了哪些不同的功能
CREATE TABLE <表名>
(
字段名 数据类型[列级别约束条件] [默认值]
字段名 数据类型[列级别约束条件] [默认值]
.
.
.
[表级别约束条件]
);
在使用CREATE TABLE 创建表时必须指定以下信息:
主键又称主码 是表中一列或多列的组合。主键约束( Primary Key Constraint )要求主键列的数据唯一并且不允许为空。主键能够唯一标识表中的一条记录 可以结合外键来定义不同数据表之间的关系 并且可以加快数据库查询的速度。主键和记录之 的关系如同身份证号码和人之 的关系 它们之间是一一对应的。主键分为两种类型。即单字段主键和多字段主键。
主键由一个字段组成,设置主键的 SQL 语旬格式分为两种情况。
(1)在定义列的同时指定主键,语法格式如下:
字段名数据类型 PRIMARY KEY [默认值]
(2)在定义完所有列之后指定主键,语法格式如下:
[CONSTRAINT <约束名>] PRIMARY KEY [字段名]
主键由多个字段联合组成,语法格式如下:
PRIMARY KEY [字 字段 2, ..., 字段时
外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。
外键对应的是参照完整性,一个表的外键可以为空值。若不为空值,则每一个外键值必须等于另一个表中主键的某个值。
外键首先是表中的一个字段,它可以不是本表的主键,但对应另外一个表的主键。
外键的主要作用是保证数据引用的完整性,在定义外键后不允许删除在另一个表中具有关联关系的行。
外键还保证数据的一致性、完整性。例如部门表 tb dept 的主键 id 在员工表 db_5 中有-个键 deptld 这个 id 关联。
[CONSTRAINT <外键名>] FOREIGN KEY 字段名1 [字段名2,…]
REFERENCES <主表名> 主键列1 [,主键列2,…]
”外键名“为定义的外键约束的名称,在一个表中不能有相同名称的外键:”字段名“表示子表需要添加外键约束的字段列。
使用 DESCRIBE/DESC 语旬可以查看表字段信息,包括字段名、字段数据类型、是否为主键、是否有默认值等,其语法格式如下:
DESCRIBE <表名>;
或者
DESC <表名>;
SHOW CREATE TABLE 语句可以用来查看表的详细信息,语法格式如下:
SHOW CREATE TABLE <表名> \G;
MySQL 是通过 ALTER TABLE语句来实现表名的修改的,具体语法格式如下
ALTER TABLE <旧表名> RENAME TO <新表名>
其中, TO 为可选参数,使用与否不影响结果。
修改字段数据类型就是把字段的数据类型转换成另一种数据类型。在 MySQL 中修改字段数据类型的语法格式如下:
ALTER TABLE <表名> MODIFY <字段> <字段类型>;
MySQL 中修改表字段名的语法格式如下:
ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新字段类型>
添加字段的语法格式如下:
其中,新字段名为需要添加的字段名称 FIRST 为可选参数,其作用是将新添加的字段设置为表的第一个字段: AFTER 为可选参数,其作用是将新添加的字段添加到已存在字段名指定的字段后面。
ALTER TABLE <表名> <新字段名> <新字段类型> [约束条件] [FIRST| AFTER 已存在的字段名];
删除字段是将数据表中的某个字段从表中移除,其语法格式如下:
ALTER TABLE <表名> DROP <字段名>;
对于已经创建的数据表,读者也可以根据实际工作的需要修改字段的排列顺序,通常使用 ALTER TABL 改变字段的排列顺序,其语法格式如下:
ALTER TABLE <表名> MODIFY <字段1> <数据类型> FIRST|AFTER <字段2>;
更改表的存储引擎的语法格式如下:
ALTER TABLE <表名> ENGINE=<更改后的存储引擎名>;
对于数据库中定义的外键,如果不再需要可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系。 MySQL中删除外键的语法格式如下:
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;
其中, “外键约束名”指在定义表时CONSTRAIN 关键字后面的参数。
在MySQL 中使用 DROP TABLE 可以一次删除一个或多个没有被其他表关联的数据表,语法格式如下:
DROP TABLE [IF EXISTS ]表1,表2, ... 表n;
其中,”表“ 指要删除的表的名称。用户可以同时删除多个表,只需将要删除的表名依次写在后面,相互之间用逗号隔开即可。
MySQL 从数据表中查询数据的基本语句为 SELECT 语旬。 SELECT 语旬的基本格式如下:
SELECT
{*|<字段列表>}
[
FROM <表 1>,<表 2> ···
[WHERE <表达式>]
[GROUP BY <group by definition>]
[HAVING <expression> [{<operator> <expression>}…]]
[ORDER BY <order by definition>]
[LIMIT [<offset>,] <row count>]
]
SELECT [字段1,字段2,...,字段n]
FROM [表或视图]
WHERE [查询条件];
mysqldump是MySQL 提供的一个非常有用的数据库备份工具。在执行 mysqldump 命令时,可以将数据库备份成个一个文本文件,该文件中实际上包含了多个 CREATE INSERT 语旬,使用这些语旬可以重新创建表和插入数据。
mysqldump 语句的基本语法格式如下:
mysqldump -u user -h host -p password dbname [tbname ,[tbname...]] > filename.sql
各个参数的含义如下:
1 .使用 mysqldump 备份单个数据库中的所有表
mysqldump -u root -p mytest > /back/mytest_20210613.sql
2.mysqldump 还可以备份数据库中的某个表 其语法格式如下:
mysqldump - u user - h host - p dbname [tbname , [tbname ···]] > filename . sql
mysqlhotcopy 是一 Perl脚本,最初由 Tim Bunc 编写并提供。它使用 LOCK TABLES、FLUSH TABLES 和cp (或 scp )来快速备份数据库。它备份数据库或单个表的最快的途径,但它只能运行在数据库 目录所在的计算机 ,并且只可以备份 MyISAM 类型的表。 mysqlhotcopy Unix 系统中运行。
mysqlhotcopy 命令的语法格式如下:
mysqlhotcopy db_name_1,...db_name_n /path/to/backup_directory
db_namel db_name_n 分别为需要备份的数据库的名称:/path/to/backup_directory指定备份文件目录。
mysql -u user -p [dbname] < filename.sql
各个参数的含义如下:
mysqlhotcopy 备份后的文件也可以用来恢复数据库,在 MySQL 服务器停止运行时将备份的数据库文件复制到MySQL 存放数据的位置( MYSQL的Data 文件夹),重新启动 MySQL 服务即可。如果以根用户执行该操作,必须指定数据库文件的所有者,输人语句如下:
chown -R mysql.mysql /var/lib/mysql/dbname
使用 mysqlhotcopy 复制的备份恢复数据库:
输入语句如下:
cp -R /path/to/backup_directory /var/lib/mysql/dbname
执行完该语旬,重启服务器, MySQL 将恢复到备份状态。
参考书籍:《 MYSQL从入门到顶目实践(超值版)》