目录
一、前言
1.MySQL的介绍
MySQL是一个开源的关系型数据库管理系统(RDBMS),广泛用于Web应用程序开发和数据存储。下面是MySQL的一些详细介绍:
1.关系型数据库管理系统:MySQL是一种关系型数据库管理系统,使用表格来组织和存储数据。它支持使用SQL(Structured Query Language)进行数据管理和查询。
2.开源和免费:MySQL是开源软件,代码可以免费获取和使用。这使得它成为广大开发者和企业非常受欢迎的选择之一。
3.跨平台支持:MySQL可在多个操作系统上运行,包括Windows、Linux、macOS等。这使得它非常灵活并适应各种环境。
4.高性能和可扩展性:MySQL以其高性能而闻名,能够处理大量的同时访问请求。它支持并发处理和多线程,可以轻松扩展到大型数据集和高流量的应用程序。
5.安全性:MySQL提供各种安全特性,例如用户认证、权限管理和数据加密。它可以保护数据免受未经授权的访问和恶意攻击。
6.数据完整性:MySQL支持各种约束,如主键、唯一性约束、外键等,以确保数据的完整性和一致性。
7.备份和恢复:MySQL提供了备份和恢复工具,可以定期备份数据库,并在需要时轻松恢复数据。
8.多种存储引擎:MySQL支持多种存储引擎,如InnoDB、MyISAM等。每种存储引擎都有不同的特性和优势,可以根据应用程序的需求选择合适的存储引擎。
9.支持复制和高可用性:MySQL支持主从复制和集群技术,可以实现数据的复制和高可用性,提高系统的可靠性和可用性。
10.可定制性:MySQL是一个模块化的系统,用户可以根据自己的需求进行定制。它提供了丰富的插件和扩展机制,使得开发者可以根据需要添加新的功能和特性。
总之,MySQL是一个功能强大、性能优越、可靠安全的关系型数据库管理系统,适用于各种规模和类型的应用程序。它在Web开发和数据存储领域得到了广泛的应用和认可。
二、存储引擎
1.什么是存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。
MySQL 提供了多个不同的存储引擎,包括处理事务安全表的引擎和处理非事务安全表的引擎。在 MySQL 中,不需要在整个服务器中使用同一种存储引擎,针对具体的要求,可以对每一个表使用不同的存储引擎。
MySQL 8.0 支持多个存储引擎,以下是一些常见的存储引擎:
InnoDB:默认存储引擎,支持事务处理和行级锁定,具有良好的数据完整性和并发性能。
MyISAM:最常用的非事务性存储引擎,适用于读频繁、写较少的应用场景。
Memory:也称为Heap,将数据存储在内存中,适用于需要快速读写操作的临时数据或缓存。不支持事务和持久性。
NDB Cluster:适用于高可用性和分布式应用,提供了将数据分布到多个服务器上的功能。
此外,MySQL 8.0 也支持其他存储引擎,如Archive、CSV、Blackhole等。每个存储引擎都具有不同的特性和适用场景,选择存储引擎应该考虑到数据访问模式、需求和性能要求等因素。默认情况下,建议使用InnoDB存储引擎,但具体选择应根据实际需求进行评估和决策。
2.常见存储引擎
2.1.InnoDB(MySQL默认引擎)
InnoDB是事务型存储引擎,提供了对数据库ACID事务的支持,并实现了SQL标准的四种隔离级别,具有行级锁定(这一点说明锁的粒度小,在写数据时,不需要锁住整个表,因此适用于高并发情形)及外键支持(所有数据库引擎中独一份,仅有它支持外键)该引擎的设计目标便是处理大容量数据的数据库系统,MySQL在运行时InnoDB会在内存中建立缓冲池,用于缓存数据及索引。
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。InnoDB是默认的MySQL引擎。
小贴士:
行锁定(Row Locking):指在数据库中对于单独的数据行进行锁定,而不是锁定整个表或其他更大的粒度。当行锁定被应用到一个数据行时,其他事务无法对该数据行进行修改或删除,直到持有锁的事务释放了锁。
行锁定的主要优点是它可以提供更好的并发性能和更细粒度的锁控制。多个事务可以同时访问不同的数据行,而不会相互阻塞。这对于具有高并发读写操作的数据库环境来说非常重要。
2.1.1.四种隔离级别
1.读未提交(Read Uncommitted):在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)
2.读已提交(Read Committed):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果
3.可重复读(Repeatable Read):这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
4.可串行化(Serializable):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争
隔离级别 脏读 不可重复读 幻读 Read Uncommitted 可能 可能 可能 Read Committed 不可能 可能 可能 Repeatable Read 不可能 不可能 可能 Serializable 不可能 不可能 不可能 小贴士:
什么是脏读、不可重复读、幻读?
脏读
脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
T2时刻,事务B把原来张三的成绩由原数据80改为了70,此后又被T3时刻的事务A读取到了,但是T4时刻事务B发生异常,进行了回滚操作。这个过程,我们称70为脏数据,事务A进行了一次脏读。
不可重复读
不可重复读,有时候也会说成“读已提交”。什么意思呢,就是在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。
图示中事务A在T1和T4查询同一语句,却得到了不同的结果,这是因为T2~T3时刻事务B对该数据进行了修改,并提交。这个过程,出现了在一个事务内两次读到的数据却是不一样的,我们称为是不可重复读。
不可重复读和脏读的区别:前者是“读已提交”,后者是“读未提交”
幻读
幻读是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。举个例子,某事务在检查表中的数据数count时,是10,过一段时间之后再查是11,这就发生了幻读,之前的检测获取到的数据如同幻觉一样。出现幻读和不可重复读的原因很像,都是在多次操作数据的时候发现结果和原来的不一样了,出现了其他事务干扰的现象。但是,幻读的偏重点是添加和删除数据,多次操作数据得到的记录数不一样;不可重复读的偏重点是修改数据,多次读取数据发现数据的值不一样了。
事务B向表中新插入了一条数据,事务A在T3时刻后查询数据的时候,突然发现数据和以前查询的时候多出了一项,像产生了幻觉一样。
2.2.MyISAM存储引擎
相比起InnoDB,没有提供对数据库事务的支持,不支持细粒度的锁(行锁)及外键,当表Insert与update时需要锁定整个表,因此效率会低一些,在高并发时可能会遇到瓶颈,但MyIsam引擎独立与操作系统,可以在windows及linux上使用。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
缺点:
不能在表损坏后恢复数据
适用场景:
MyIsam极度强调快速读取
MyIsam表中自动存储了表的行数,需要时直接获取即可
适用于不需要事物支持、外键功能、及需要对整个表加锁的情形
2.3.Memory存储引擎
使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。 HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。 Memory同时支持散列索引和B树索引,B树索引可以使用部分查询和通配查询,也可以使用<,>和>=等操作符方便数据挖掘,散列索引相等的比较快但是对于范围的比较慢很多。
缺点:
要求存储的数据是数据长度不变的格式,Blob和Text类型数据不可用(长度不固定)
用完表格后表格便被删除
适用场景:
那些内容变化不频繁的代码表,或者作为统计操作的中间结果表,便于高效地堆中间结果进行分析并得到最终的统计结果
目标数据比较小,而且非常频繁的进行访问,在内存中存放数据,如果太大的数据会造成内存溢出。可以通过参数max_heap_table_size控制Memory表的大小,限制Memory表的最大的大小
数据是临时的,而且必须立即能取出用到,于是可存放在内存中
存储在Memory表中的数据如果突然间丢失的话也没有太大的关系
3.ACID事务
原子性(Atomicity):事务是一个原子性质的操作单元,事务里面的对数据库的操作要么都执行,要么都不执行。
一致性(Consistency):在事务开始之前和完成之后,数据都必须保持一致状态,必须保证数据库的完整性。也就是说,数据必须符合数据库的规则。
隔离性(Isolation):一个事务的执行不能被其他事务干扰。即一个事务的内部操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):持久性也成为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久的。
三、CRUD操作
1.插入数据
创建(Create)操作:创建操作用于向数据库中添加新的数据记录。在MySQL中,我们可以使用INSERT INTO语句来进行创建操作。
INSERT INTO users (name, email, age) VALUES ('John', '[email protected]', 25);
2.查询数据
读取(Read)操作:读取操作用于从数据库中检索数据记录。在MySQL中,我们可以使用SELECT语句来进行读取操作。
例如,从
users
表中检索所有记录:SELECT * FROM users;
或者,从
users
表中检索满足特定条件的记录:SELECT * FROM users WHERE age > 18;
3.修改数据
修改(Update)操作:更新操作用于修改数据库中现有的数据记录。在MySQL中,我们可以使用UPDATE语句进行更新操作。
例如,修改
users
表中的一条记录的年龄:UPDATE users SET age = 30 WHERE id = 1;
4.删除数据
删除(Delete)操作:删除操作用于从数据库中删除数据记录。在MySQL中,我们可以使用DELETE FROM语句进行删除操作。
例如,从
users
表中删除满足特定条件的记录:DELETE FROM users WHERE age > 60;
四、数据库
1.默认数据库的介绍
information_schema
information_schema提供了访问数据库元数据的方式。(元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有时用于表述该信息的其他术语包括“数据词典”和“系统目录”。) 换句换说,information_schema是一个信息数据库,它保存着关于MySQL服务器所维护的所有其他数据库的信息。(如数据库名,数据库的表,表栏的数据类型与访问权限等)
mysql
MySQL 的核心数据库,类似于 SQL Server 中的 master 表,主要负责存储数据库用户、用户访问权限等 MySQL 自己需要使用的控制和管理信息。常用的比如在 mysql 数据库的 user 表中修改 root 用户密码。
performance_schema
主要用于收集数据库服务器性能参数。并且库里表的存储引擎均为PERFORMANCE_SCHEMA,而用户是不能创建存储引擎为PERFORMANCE_SCHEMA的表。MySQL5.7默认是开启的。
sys
MySQL 8.0 安装完成后会多一个 sys 数据库。sys 数据库主要提供了一些视图,数据都来自于performation_schema,主要是让开发者和使用者更方便地查看性能问题。
2.创建数据库
在MySQL中,可以使用 CREATE DATABASE 语句创建数据库,语法格式如下:
CREATE DATABASE [IF NOT EXISTS] <数据库名> [[DEFAULT] CHARACTER SET <字符集名>] [[DEFAULT] COLLATE <校对规则名>];
[]中的内容是可选的。语法说明如下:
<数据库名>:创建数据库的名称。MySQL 的数据存储区将以目录方式表示 MySQL 数据库,因此数据库名称必须符合操作系统的文件夹命名规则,不能以数字开头,尽量要有实际意义。注意在 MySQL 中不区分大小写。
IF NOT EXISTS:在创建数据库之前进行判断,只有该数据库目前尚不存在时才能执行操作。此选项可以用来避免数据库已经存在而重复创建的错误。
[DEFAULT] CHARACTER SET:指定数据库的字符集。指定字符集的目的是为了避免在数据库中存储的数据出现乱码的情况。如果在创建数据库时不指定字符集,那么就使用系统的默认字符集。
[DEFAULT] COLLATE:指定此数据库的默认排序规则。
3.查看库
在 MySQL 中,可使用 SHOW DATABASES 语句来查看或显示当前用户权限范围以内的数据库。查看数据库的语法格式为:
SHOW DATABASES [LIKE '数据库名'];
语法说明如下:
LIKE 从句是可选项,用于匹配指定的数据库名称。LIKE 从句可以部分匹配,也可以完全匹配。
数据库名由单引号
' '
包围。
4.删除库
在 MySQL 中,当需要删除已创建的数据库时,可以使用 DROP DATABASE 语句。其语法格式为:
DROP DATABASE [ IF EXISTS ] <数据库名>
语法说明如下:
<数据库名>:指定要删除的数据库名。
IF EXISTS:用于防止当数据库不存在时发生错误。
DROP DATABASE:删除数据库中的所有表格并同时删除数据库。使用此语句时要非常小心,以免错误删除。如果要使用 DROP DATABASE,需要获得数据库 DROP 权限。
注意:MySQL 安装后,系统会自动创建名为 information_schema 和 mysql 的两个系统数据库,系统数据库存放一些和数据库相关的信息,如果删除了这两个数据库,MySQL 将不能正常工作。
五、用户
0.前言
MySQL 在安装时,会默认创建一个名为 root 的用户,该用户拥有超级权限,可以控制整个 MySQL 服务器。
1.创建用户
MySQL 提供了以下 3 种方法创建用户。
使用 CREATE USER 语句创建用户
在 mysql.user 表中添加用户
使用 GRANT 语句创建用户
使用 CREATE USER 语句创建用户
可以使用 CREATE USER 语句来创建 MySQL 用户,并设置相应的密码。其基本语法格式如下:
CREATE USER <用户> [ IDENTIFIED BY [ PASSWORD ] 'password' ] [ ,用户 [ IDENTIFIED BY [ PASSWORD ] 'password' ]]
参数说明如下:
用户:指定创建用户账号,格式为
user_name'@'host_name
。这里的user_name
是用户名,host_name
为主机名,即用户连接 MySQL 时所用主机的名字。IDENTIFIED BY子句:用于指定用户密码。新用户可以没有初始密码,若该用户不设密码,可省略此子句。
PASSWORD 'password':PASSWORD 表示使用哈希值设置密码,该参数可选。
示例:
CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
小贴士:
修改密码
SET PASSWORD 语句可以用来重新设置其他用户的登录密码或者自己使用的账户的密码。使用 SET 语句修改密码的语法结构如下:
SET PASSWORD = PASSWORD ("rootpwd");
2.查看用户
#切换数据库 use mysql; #查询用户信息 select host,user,authentication_string from user;
MySQL 5.7 版本不再使用 Password 来作为密码的字段,而改成了 authentication_string。
host参数值说明:
host列值 含义 % 匹配所有主机 localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接 127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问 ::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
3.用户赋权
在 MySQL 中,拥有 GRANT 权限的用户才可以执行 GRANT 语句,其语法格式如下:
GRANT priv_type [(column_list)] ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password'] [, user[IDENTIFIED BY [PASSWORD] 'password']] ... [WITH with_option [with_option]...]
参数说明:
priv_type 参数表示权限类型;
columns_list 参数表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
database.table 用于指定权限的级别;
user 参数表示用户账户,由用户名和主机名构成,格式是“'username'@'hostname'”;
IDENTIFIED BY 参数用来为用户设置密码;
password 参数是用户的新密码。
WITH 关键字后面带有一个或多个 with_option 参数。这个参数有 5 个选项,详细介绍如下:
GRANT OPTION:被授权的用户可以将这些权限赋予给别的用户;
MAX_QUERIES_PER_HOUR count:设置每个小时可以允许执行 count 次查询;
MAX_UPDATES_PER_HOUR count:设置每个小时可以允许执行 count 次更新;
MAX_CONNECTIONS_PER_HOUR count:设置每小时可以建立 count 个连接;
MAX_USER_CONNECTIONS count:设置单个用户可以同时具有的 count 个连接。
示例:
GRANT SELECT,INSERT ON *.* TO 'zking'@'localhost' IDENTIFIED BY '1234' WITH GRANT OPTION;
4.收回用户权限
删除用户某些特定的权限,语法格式如下:
REVOKE priv_type [(column_list)]... ON database.table FROM user [, user]...
REVOKE 语句中的参数与 GRANT 语句的参数意思相同。其中:
priv_type 参数表示权限的类型;
column_list 参数表示权限作用于哪些列上,没有该参数时作用于整个表上;
user 参数由用户名和主机名构成,格式为“username'@'hostname'”。
示例1:取消用户的某些权限
REVOKE INSERT ON *.* FROM 'zking'@'localhost'
示例2:取消用户的所有权限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'zking'@'localhost'
5.查看用户权限
使用 SHOW GRANTS FOR 语句查看权限。其语法格式如下:
SHOW GRANTS FOR 'username'@'hostname';
其中,username 表示用户名,hostname 表示主机名或主机 IP。
示例:
SHOW GRANTS FOR 'xw'@'localhost';
6.删除用户
使用DROP USER语句查看权限。其语法格式如下:
DROP USER 'username'@'host';
其中,'username’是要删除的用户的用户名,'host’是指定该用户的主机。
例如,要删除名为 “john” 的用户及其关联的权限,可以执行以下命令:
DROP USER 'john'@'localhost';
温馨提示:版本不同可能语句也会不同,本篇所有语句以MySQL8.0为准!!
这篇分享就到这里,觉得有帮助的话还请个博主个赞!!