《MySQL 入门:数据库世界的第一扇门》
一、MySQL 简介
MySQL 是一种开源的关系型数据库管理系统,在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称,广泛应用于网站、企业级应用、数据分析等领域。
MySQL 具有诸多优点。首先,它成本低,作为开源软件,可以免费使用和修改。其次,性能强,执行速度快,能够处理大量的数据请求。同时,MySQL 体积小,简单实用,对初学者友好,容易安装和使用。
在性能方面,MySQL 拥有优化的 SQL 查询算法,能有效地提高查询速度。它支持多线程,充分利用 CPU 资源,既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。此外,MySQL 提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS 等都可以用作数据表名和数据列名。它还提供 TCP/IP、ODBC 和 JDBC 等多种数据库连接途径,以及用于管理、检查、优化数据库操作的管理工具。MySQL 支持大型的数据库,可以处理拥有上千万条记录的大型数据库,并且支持多种存储引擎。
MySQL 的存储引擎丰富多样,各有特点。MyISAM 是 MySQL 5.0 之前的默认数据库引擎,拥有较高的插入,查询速度,但不支持事务。InnoDB 是事务型数据库的首选引擎,支持 ACID 事务,支持行级锁定,从 MySQL 5.5 起成为默认数据库引擎。BDB 也是事务型数据库的另一种选择,支持 Commit 和 Rollback 等其他事务特性。Memory 存储引擎所有数据置于内存,拥有极高的插入,更新和查询效率,但会占用和数据量成正比的内存空间,且内容会在 MySQL 重新启动时丢失。Merge 将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用。Archive 非常适合存储大量的独立的,作为历史记录的数据。Federated 将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。CSV 存储引擎逻辑上由逗号分割数据,不支持索引。BlackHole 是黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继。EXAMPLE 存储引擎是一个不做任何事情的存根引擎,主要用于演示如何编写新存储引擎。
索引是 MySQL 中一种特殊的文件,包含着对数据表里所有记录的引用指针。索引可以加快数据检索操作,但会使数据修改操作变慢。每修改数据记录,索引就必须刷新一次。为了在某种程度上弥补这一缺陷,许多 SQL 命令都有一个 DELAY_KEY_WRITE 项,可暂时制止 MySQL 在插入或修改记录后立刻对索引进行刷新,等到全部记录插入 / 修改完毕之后再进行。在需要插入许多新记录的场合,这个选项作用非常明显。另外,索引还会在硬盘上占用相当大的空间。
二、安装与配置 MySQL
1. Windows 安装与配置
- 下载安装包,执行 “典型安装”,勾选 “添加到 PATH”。在安装 MySQL 时,首先需要从官网下载适合 Windows 系统的安装程序。运行安装程序并遵循向导,选择 “典型安装” 选项,确保在安装过程中勾选 “添加到 PATH”,这样便于在命令行中直接使用 MySQL 命令。
- 安装完成后,以命令行方式运行 mysql -u root -p 进入 MySQL 命令行界面。安装完成后,可以通过命令行方式运行 “mysql -u root -p”,然后输入密码即可进入 MySQL 命令行界面,开始对数据库进行操作。
2. Linux 安装与配置
- 借助包管理器安装,如 Ubuntu 使用 sudo apt update 和 sudo apt install mysql-server。在 Linux 系统中,以 Ubuntu 为例,可以借助包管理器进行安装。首先打开终端,输入 “sudo apt update” 更新软件列表,然后输入 “sudo apt install mysql-server” 安装 MySQL 服务器。
- 运行 sudo systemctl start mysql 启动服务,使用 sudo systemctl status mysql 检查服务状态。安装完成后,可以运行 “sudo systemctl start mysql” 启动服务,然后使用 “sudo systemctl status mysql” 检查服务状态,确保 MySQL 服务正常运行。
3. macOS 安装与配置
- 通过 Homebrew 安装或直接下载安装包,运行安装脚本,进行服务启动与配置。在 macOS 系统中,可以通过 Homebrew 安装 MySQL,也可以直接从官网下载安装包进行安装。安装完成后,运行安装脚本,进行服务启动与配置,确保 MySQL 在 macOS 系统上正常运行。
三、MySQL 基本操作
1. 创建数据库和表
- 使用 CREATE DATABASE 命令创建数据库。
在 MySQL 中,我们使用 “CREATE DATABASE” 命令来创建数据库。这是一个非常简单且基础的命令,其语法为:CREATE DATABASE 数据库名。例如,如果你想创建一个名为 “test_db” 的数据库,那么你需要执行的命令就是:CREATE DATABASE test_db。执行这个命令后,MySQL 会在服务器上创建一个新的数据库,名为 “test_db”。
- 在创建的数据库中,利用 CREATE TABLE 命令建立表,并定义表的字段。
在创建了数据库后,我们可以使用 CREATE TABLE 命令在数据库中建立表。例如,在 “test_db” 数据库中创建一个名为 “users” 的表,包含 id、name 和 age 三个列,可以使用以下命令:CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR (50) NOT NULL,age INT NOT NULL); 在这个例子中,id 列是整数类型,具有主键属性且自动递增;name 列是可变长度字符串类型,不允许为空;age 列是整数类型,不允许为空。
2. 数据类型与字段设置
- MySQL 支持多种数据类型,如 INT、VARCHAR、CHAR、TEXT、DATE 和 DATETIME、BOOLEAN 等。
MySQL 的数据类型主要包括以下五大类:整数类型(如 BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、INT、BIG INT);浮点数类型(如 FLOAT、DOUBLE、DECIMAL);字符串类型(如 CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB);日期类型(如 Date、DateTime、TimeStamp、Time、Year);其他数据类型(如 BINARY、VARBINARY、ENUM、SET、Geometry、Point、MultiPoint、LineString、MultiLineString、Polygon、GeometryCollection 等)。
- 每个字段可设置特定属性,如默认值、非空约束、唯一性检查等。
每个字段可以设置特定的属性,比如非空约束(NOT NULL)表示该字段的值不能为空;默认值(DEFAULT)表示如果插入数据时没有给该字段赋值,那么就使用默认值;唯一性检查(UNIQUE KEY)表示该字段下的值不能重复,null 除外。例如,以下语句将创建一个名为 “students” 的表,并设置 name 列不允许为空,age 列默认值为 18:CREATE TABLE students (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR (50) NOT NULL,age INT DEFAULT 18);
3. 基础 SQL 查询
- 使用 SELECT 语句查询并获取数据,可添加 WHERE 子句进行条件查询。
SELECT 语句用于从数据库中检索数据。例如,从 “users” 表中选择所有列可以使用以下命令:SELECT * FROM users; 若要选择特定列,可以指定列名,如:SELECT id, name FROM users;WHERE 子句用于过滤查询结果。例如,仅显示 age 大于 20 的用户:SELECT * FROM users WHERE age > 20;
4. 数据操作
- 插入数据:使用 INSERT INTO 语句。
使用 INSERT INTO 语句向表中插入数据。例如,向 “users” 表中插入一条数据:INSERT INTO users (name, age) VALUES ('John', 25); 如果有列是必填,那就需要带上。自动编号的列不用填写,它会自动获得。填入值得时候除了数值不用加单引号,其他类型的值都要加单引号。我们还可以用 SYSDATE () 获取系统时间。可以用 PASSWORD (值),将数值 MD5 加密。
- 更新数据:使用 UPDATE 语句。
更新表中的数据使用 UPDATE。例如,将 “users” 表中 name 为 'John' 的用户的 age 更新为 26:UPDATE users SET age = 26 WHERE name = 'John';
- 删除数据:使用 DELETE FROM 语句。
删除表中的数据使用 DELETE FROM。例如,删除 “users” 表中 age 小于 18 的用户:DELETE FROM users WHERE age < 18;
四、数据完整性管理
在 MySQL 中,主键与外键用于维护数据一致性,确保数据的唯一性和关联性。
一、主键的作用
主键是能确定一条记录的唯一标识,在 MySQL 中,你可以通过创建主键来确保表中某个字段的唯一性。例如,学生表中的学号可以作为主键,每个学生的学号是唯一的,能唯一标识该学生的记录。主键具有以下特点:
- 唯一性:保证列中的每个值都是唯一的。
- 非空性:主键列不能有 NULL 值。
- 索引:MySQL 会自动为主键列创建索引,优化查询性能。
创建表时可以定义主键,语法如下:
CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,...PRIMARY KEY(column_name));
修改现有表也可以添加主键:
ALTER TABLE table_name ADD PRIMARY KEY(column_name);
还可以使用复合主键,当某一列不能唯一识别每行时,可将两列或多列看为一个整体作为主键,语法如下:
CREATE TABLE table_name (column1 datatype,column2 datatype,column3 datatype,...PRIMARY KEY(column1, column2, column3));
二、外键的作用
外键用于与另一张表的关联,以另一个表的外键作主关键字的表被称为主表,具有此外键的表被称为主表的从表。表的外键值必须在主表中能找到。当主表的记录被从表参照时,主表的记录不允许删除。
例如,class 表与 Student 表通过 class_id 关联,实现一对多的关系。class_id 作为 Student 表的外键,Student 表为从表,在 class 表中为主键,class 表为主表。
创建外键的语法如下:
-- 主表
CREATE TABLE 表1(列名1 数据类型 primary key,列名2 数据类型);
-- 从表(外键约束所在的表)
CREATE TABLE 表2(FK_列名1 数据类型,列名2 数据类型,constraint 外键约束的名字 foreign key(从表的列名1) references 主表表名(主表的列名1));
三、主键与外键维护数据一致性
- 插入新记录时,首先插入主表(具有自增主键的表),然后获取该主键的值,再插入到子表(拥有外键的表)。
-
- 示例代码:
-- 插入主表记录
INSERT INTO parent_table (column1, column2) VALUES ('value1', 'value2');
-- 获取自增主键
SELECT LAST_INSERT_ID();
-- 插入子表记录
INSERT INTO child_table (foreign_key_column, column1, column2) VALUES (LAST_INSERT_ID(), 'value1', 'value2');
- 更新主表记录时,同样需要同步更新子表中的相关记录。
-
- 示例代码:
-- 更新主表记录
UPDATE parent_table SET column1 = 'new_value1' WHERE primary_key_column = 1;
-- 同步更新子表记录
UPDATE child_table SET column1 = 'new_value1' WHERE foreign_key_column = 1;
- 删除主表记录时,可以使用级联删除或者先删除子表中关联的记录,再删除主表记录。
-
- 示例代码:
-- 级联删除
DELETE FROM parent_table WHERE primary_key_column = 1;
-- 或者先删除子表记录
DELETE FROM child_table WHERE foreign_key_column = 1;
DELETE FROM parent_table WHERE primary_key_column = 1;
为保证数据一致性,应该在定义外键时设置正确的删除规则,如 ON DELETE CASCADE,这样在删除主表记录时,子表中的相关记录会自动被删除。
五、MySQL 安全与权限管理
MySQL 的安全与权限管理至关重要,它通过用户账户和权限管理实现安全,确保数据访问的可控性。
用户和权限管理的存储位置
在 MySQL 5.7.24 中,关于用户及用户权限的相关信息,都保存在了 mysql 库中的 user 表中,可以将 user 表中大致分为用户列、权限列、安全列、资源控制列这几种。
用户列
user 表的用户列包括 Host、User、password,分别表示主机名、用户名和密码。其中 user 和 Host 为 user 表的联合主键。当用户与服务器之间建立连接时,输入的账户信息中的用户名称、主机名和密码必须匹配 user 表中对应的字段,只有 3 个值都匹配的时候,才允许连接的建立。这 3 个字段的值就是创建账户时保存的账户信息。修改用户密码时,实际就是修改 user 表的 password 字段值。
权限列
权限列的字段决定了用户的权限,描述了在全局范围内允许对数据和数据库进行的操作。包括查询权限、修改权限等普通权限,还包括了关闭服务器、超级权限和加载用户等高级权限。普通权限用于操作数据库;高级权限用于数据库管理。user 表中对应的权限是针对所有用户数据库的。这些字段值的类型为 ENUM,可以取的值只能为 Y 和 N,Y 表示该用户有对应的权限;N 表示用户没有对应的权限。查看 user 表的结构可以看到,这些字段的值默认都是 N。如果要修改权限,可以使用 GRANT 语句或 UPDATE 语句更改 user 表的这些字段来修改用户对应的权限。
安全列
安全列只有 6 个字段,其中两个是 SSI 相关的,2 个是 x509 相关的,另外 2 个是授权插件相关的。SSI 用于加密;X509 标准可用于标识用户:Plugin 字段标识可以用于验证用户身份的插件,如果该字段为空,服务器使用内建授权验证机制验证用户身份。可以通过 SHOW VARIABLES LIKE ’have_openssl’语句来查询服务器是否支持 SSI 功能。
资源控制列
资源控制列的字段用来限制用户使用的资源,包含 4 个字段,分别为:
- Max_questions— 用户每小时允许执行的查询操作次数。
- Max_updates— 用户每小时允许执行的更新操作次数。
- Max_connections— 用户每小时允许执行的连接操作次数。
- Max_user_connections— 用户允许同时建立的连接次数。
一个小时内用户查询或者连接数量超过资源控制限制,用户将被锁定,直到下一个小时,才可以在此执行对应的操作。可以使用 GRANT 语句更新这些字段的值。
注:若新建的用户无法登录到数据库,排除权限错误的前提下,可以尝试刷新权限,命令如下:mysql> flush privileges;
创建用户
- 使用 create
-
- 语法格式:CREATE USER <用户> [IDENTIFIED BY [PASSWORD] 'password'] [, 用户 [IDENTIFIED BY [PASSWORD] 'password']]
-
- 例:CREATE USER 'username'@'localhost' IDENTIFIED BY 'passwd';
- 使用 GRANT 新建用户
-
- 语法格式:GRANT priv_type ON database.table TO user [IDENTIFIED BY [PASSWORD] 'password']
-
- priv_type 参数表示新用户的权限;database.table 参数表示新用户的权限范围,即只能在指定的数据库和表上使用自己的权限;user 参数指定新用户的账号,由用户名和主机名构成;IDENTIFIED BY 关键字用来设置密码;password 参数表示新用户的密码。
-
- 例:GRANT SELECT ON . TO 'test'@localhost IDENTIFIED BY 'passwd';
修改用户
- 修改用户名
-
- 语法格式:RENAME USER <旧用户> TO < 新用户 >< 旧用户 >:系统中已经存在的 MySQL 用户账号。< 新用户 >:新的 MySQL 用户账号。RENAME USER 语句用于对原有的 MySQL 用户进行重命名。若系统中旧账户不存在或者新账户已存在,该语句执行时会出现错误。使用 RENAME USER 语句,必须拥有 mysql 数据库的 UPDATE 权限或全局 CREATE USER 权限。
-
- 例:RENAME USER 'test1'@'localhost' TO 'test02'@'localhost';
- 修改用户密码
-
- 使用 set 修改
-
-
- 语法格式:SET PASSWORD FOR 'username'@'hostname' = PASSWORD ('newpasswd');
-
-
- 使用 GRANT 修改
-
-
- 语法格式:GRANT USAGE ON . TO 'user'@'hostname' IDENTIFIED BY 'newpasswd';
-
-
-
- 例:GRANT USAGE ON . TO 'test'@'localhost' IDENTIFIED BY 'newpasswd';
-
删除用户
- 使用 DROP 删除用户
-
- 语法格式:DROP USER 'username'@'host'[,user@host]...
-
- 注意:用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,MySQL 不会记录是谁创建了这些对象
-
- 例:DROP USER 'test1'@'localhost';
- 使用 DELETE 删除用户
-
- 语法格式:DELETE FROM mysql.user WHERE Host='hostname' AND User='username';
-
- 例:DELETE FROM mysql.user WHERE Host='localhost' AND User='test1';
查看用户权限
- 使用 SELECT 查询
-
- 语法格式:SELETE * FROM 'username'@'hostname';
-
- 注意:新建用户只有登录权限,没有任何其它权限,不能查询 user 表
- 使用 SHOW GRANTS FOR 查询
-
- SHOW GRANTS FOR 'username'@'host'; #查看指定用户的权限
-
- SHOW GRANTS FOR CURRENT_USER; #查看当前用户的权限
用户权限管理
- 赋予权限
-
- GRANT 提权
-
- GRANT 权限列表 ON 数据库名。表名 TO ' 用户名 '@' 来源地址’ [IDENTIFIED BY ' 密码 '];
-
- #权限列表:用于列出授权使用的各种数据库操作,以逗号进行分隔,如 "select,insert,update"。使用 "all" 表示所有权限,可授权执行任何操作。
-
- #数据库名。表名:用于指定授权操作的数据库和表的名称,其中可以使用通配符 ""。例如,使用"sch." 表示授权操作的对象为 sch 数据库中的所有表。
-
- #用户名 @来源地址 ': 用于指定用户名称和允许访问的客户机地址,即谁能连接、能从哪里连接。来源地址可以是域名、IP 地址,还可以使用 "%" 通配符,表示某个区域或网段内的所有地址,如 "%.xyw.com"、"192.168.226.%" 等。
-
- #IDENTIFIEDBY: 用于设置用户连接数据库时所使用的密码字符串。在新建用户时,若省略 "IDENTIFIED BY" 部分,则用户的密码将为空。
-
- #允许用户 zhangsan 在本地查询 sch 数据库中所有表的数据记录,但禁止查询其他数据库中的表的记录。
-
- GRANT select ON sch.* To 'zhangsan'@'localhost' IDENTIFIED BY 'abc123 ';
-
- #允许用户 lisi 在所有终端远程连接 mysql,并拥有所有权限。
-
- GRANT ALL[PRIVILEGES] ON . TO 'lisi'@'%’ IDENTIFIED BY '123456';
-
- flush privileges;# 刷新权限 (刷新的是权限表)
- 查看权限
-
- 登录用户只能看自己(拥有所有权限的账户除外)
-
- show grants for'zhangsan'@'%';
- 移除权限
-
- revoke select on sch.* from 'zhangsan'@'%';
-
- #USAGE 权限只能用于数据库登陆,不能执行任何操作;USAGE 权限不能被回收,即 REVOKE 不能删除用户。
-
- flush privileges;
权限表的存取
对于身份的认证,MySQL 是通过 IP 地址和用户名联合进行确认的,例如 MySQL 安装后默认创建的用户 root@localhost 表示用户 root 只能从本地(localhost)进行连接才可以通过认证,在其他任何主机进行连接都将被拒绝,也就是说同一个用户,来自不同的 IP 地址,MySQL 将其视为不同的用户。
MySQL 的权限表在数据库启动的时候就载入了内存,当用户通过身份认证后,就在内存中进行相应权限的存取。在权限存取的两个过程中,系统会用到 “mysql” 数据库中的 user、host、db 这 3 个最重要的权限表,而 host 表在 MySQL:5.6.7 之后就删除了。
mysql 库 user 表中的列:user 表中的列主要分为 4 个部分:用户列、权限列、安全列、资源控制列。用的比较多的是用户列和权限列,权限列又分为普通权限和管理权限。普通权限主要用于数据库的操作,比如 select_priv、create_priv 等;管理权限主要用来对数据库进行管理的操作,比如 process_priv、super_priv 等。
当用户进行连接时,权限表的存取过程有以下两个阶段:
- 先从 user 表中的 host、user 和 password 这 3 个字段中判断连接的 IP、用户名和密码是否存在于表中,如果存在,则通过身份验证,否则拒绝连接。
- 通过身份验证,按照以下权限表的顺序得到数据库权限:user --> db --> tables_priv --> columns_priv。
说明:MySQL:8.0 以后 user 表中去掉了 password,取而代之的是 authentication_string,修改密码的方式:ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘密码’;
下面举个例子解释一下权限表存取过程的第二个阶段:
- 创建用户 dongsq@localhost,并赋予所有数据库上的所有表的 select 权限。
说明:MySQL:8.0 之后不支持授权的时候就进行用户创建,所以创建之后才能授权;
- 再看 db 表:可以发现,user 表中的 select_priv 列是 "Y", 而 db 表中却没有,也就是说,对所有数据库都具有相同权限的用户记录并不需要记入 db 表,而仅仅需要将 user 表中的 select_priv 改为 "Y" 即可。换句话说,user 表中的每个权限都代表了对所有数据库都有的权限。
- 创建数据库 dongsq,将 dongsq@localhost 上的权限改为只针对 dongsq 数据库上所有表的 select 权限。这时候发现 user 表中的 select_priv 变为了 "N",而 db 表中增加了 db 为 dongsq 的一条记录。也就是说:当只授予部分数据库某些权限时,user 表中的相应权限列保持 "N",而将具体的数据库权限写入了 db 表,table 和 column 的权限机制和 db 相似。
账号管理
- 创建账号
上面提到过:MySQL:8.0 之后不支持授权的时候就进行用户创建,所以创建之后才能授权;
示例一:现在给 dongsq@localhost 增加 grant 权限:
mysql> grant all privileges on *.* to dongsq@localhost with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> select * from user where user = 'dongsq' and host='localhost' \\G;
*************************** 1. row ***************************
Host: localhost
User: dongsq
Select_priv: Y
Insert_priv: Y
Update_priv: Y
Delete_priv: Y
Create_priv: Y
Drop_priv: Y
Reload_priv: Y
Shutdown_priv: Y
Process_priv: Y
File_priv: Y
Grant_priv: Y
示例二:创建新用户 zhangsan,可以从任何 IP 进行连接,权限为对 dongsq 数据库里所有表进行 SELECT、UPDATE、INSERT 和 DELETE 操作,初始化密码为 ‘123456’
本例中的 IP 限制为所有 IP 都可以连接,因此设置为 %
说明:Host 值可以时主机名或 IP 号,或 "localhost"指出本地主机,可以在 Host 列值使用通配符字符"%"和"_"。"%"匹配任何主机名,空 Host 值等价于"%",他们的含义与 LIKE 操作符的模式匹配操作相同。
说明:如果权限表中 host 既有 % 又有 localhost,而此时,连接从主机 localhost 过来,显然 user 表中有两条记录都符合匹配条件,那系统会选择哪一个呢?如果有多个匹配,按照下述原则来解决:
- 服务器在启动时读入 user 表后进行排序,它首先以最具体的 Host 值排序,主机名和 IP 号时最具体的;
- 然后当用户试图连接时,以排序的顺序浏览条目;
- 服务器使用与客户端和用户名匹配的第一行;
很显然,当 user 表出现 localhost 和 % 时,从主机 localhost 过来,匹配的 host 为 "localhost" 对应的权限。
- 查看账号权限
示例三:查看账号权限
示例四:更改账号权限
权限的变更有两种方法:使用 GRANT (新增) 和 REVOKE (回收) 语句,或者变更权限表。第二种方法直接对 user、db、tables_priv 和 columns_priv 中的权限列进行更新即可,介绍一下第一种方法中 revoke
示例三中 zhangsan 账号有增删改查的四个权限,现在回收删除权限:
REVOKE DELETE ON dongsq.* FROM 'zhangsan'@'%';
示例五:删除账号
账号资源限制
账号资源限制这类选项的作用是限制每个账号实际具有的资源限制,这里的 "资源" 主要包括:
- 单个账号每小时执行的查询次数
- 单个账号每小时执行的更新次数
- 单个账号每小时连接服务器的次数
- 单个账号并发连接服务器的次数
在实际应用中可能会由于程序 bug 或者系统遭到攻击,使得应用短时间内发生了大量的点击,对数据库造成了严重的并发访问,为防止这种问题,我们可以通过对连接账号进行资源限制的方式解决,比如按照日常访问量加上一定冗余设置每小时查询 1w 次,那么 1 小时内超过 1w 次查询数据库就会给出资源不足的提示,而不会再分配资源进行实际查询。
设置资源限制的语法为:Alter...with option
option 的选项可以是:
MAX_QUERIES_PER_HOUR count: 每小时最大查询次数
MAX_UPDATES_PER_HOUR count: 每小时最大更新次数
MAX_COUNNECTIONS_PER_HOUR count: 每小时最大连接数
MAX_USER_CONNECTIONS count: 最大用户连接数
其中,MAX_CONNECTIOINS_PER_HOUR count 和 MAX_USER_CONNECTIONS count 的区别在于前者是每小时累计的最大连接数,而后者是瞬间的并发连接数。
六、常见问题解决与最佳实践
1. 排查与优化
- 诊断错误:使用 SHOW ERRORS 查找错误,使用错误代码定位问题。在 MySQL 中,当出现错误时,可以通过 SHOW ERRORS 命令来查看具体的错误信息。该命令会列出最近发生的错误,包括错误代码和错误描述。通过错误代码,可以在 MySQL 的文档或在线资源中查找对应的解决方案,从而快速定位问题所在。
- 性能优化:监控查询性能,使用索引提高查询效率,优化慢查询。
-
- 监控查询性能:可以使用 MySQL 的性能监控工具来了解查询的执行情况。例如,可以通过 EXPLAIN 命令来查看查询的执行计划,了解 MySQL 是如何执行查询的,以及是否使用了索引等。此外,还可以使用 MySQL 的慢查询日志来记录执行时间较长的查询,以便进行分析和优化。
-
- 使用索引提高查询效率:索引是提高查询效率的重要手段。在 MySQL 中,可以通过创建索引来加快数据的检索速度。例如,可以在经常用于查询的字段上创建索引,如主键、外键、唯一约束字段等。创建索引时,需要考虑索引的类型、长度和选择性等因素,以确保索引的有效性和性能。
-
- 优化慢查询:对于执行时间较长的查询,可以通过优化查询语句、调整索引、增加缓存等方式来提高查询效率。例如,可以使用 JOIN 代替子查询、避免使用 SELECT * 等。此外,还可以使用 MySQL 的缓存机制来缓存查询结果,减少重复查询的开销。
2. 备份与恢复
- 备份:定期使用 mysqldump 或 mysqlbinlog 进行数据库备份。
-
- mysqldump:是 MySQL 自带的逻辑备份工具,可以将数据库中的数据导出为 SQL 语句文件。使用 mysqldump 可以备份整个数据库、单个表或部分数据。例如,可以使用以下命令备份整个数据库:mysqldump -u username -p password database_name > backup.sql。
-
- mysqlbinlog:是 MySQL 自带的二进制日志备份工具,可以记录数据库的变更操作。使用 mysqlbinlog 可以备份数据库的增量数据,以便在恢复数据时使用。例如,可以使用以下命令备份二进制日志:mysqlbinlog --no-defaults --raw --read-from-remote-server --host=remote_host --user=remote_user --password=remote_password --stop-never binary_log_file > backup.log。
- 恢复:通过 mysql 命令从备份文件恢复数据库。
-
- 使用 source 命令:可以使用 source 命令在 MySQL 客户端中恢复数据库。例如,可以使用以下命令恢复数据库:source backup.sql。
-
- 使用 mysql 命令:可以使用 mysql 命令在命令行中恢复数据库。例如,可以使用以下命令恢复数据库:mysql -u username -p password database_name < backup.sql。
-
- 使用 Percona XtraBackup:是一款开源的 MySQL 热备份工具,可以在不停止数据库服务的情况下进行备份和恢复。使用 Percona XtraBackup 可以备份整个数据库、单个表或部分数据,并可以在恢复数据时进行增量恢复。例如,可以使用以下命令备份数据库:innobackupex --user=username --password=password /backup/directory。恢复数据库时,可以使用以下命令:innobackupex --apply-log /backup/directory 和 innobackupex --copy-back /backup/directory。
相关文章:
《MySQL 入门:数据库世界的第一扇门》
一、MySQL 简介 MySQL 是一种开源的关系型数据库管理系统,在数据库领域占据着重要地位。它以其高效查询、高安全性、低成本和扩展性著称,广泛应用于网站、企业级应用、数据分析等领域。 MySQL 具有诸多优点。首先,它成本低,作为…...
Qt之第三方库QCustomPlot使用(二)
Qt开发 系列文章 - qcustomplot(二) 目录 前言 一、Qt开源库 二、QCustomPlot 1.qcustomplot介绍 2.qcustomplot下载 3.qcustomplot移植 4.修改项目文件.pro 5.提升QWidget类 三、技巧讲解 1.拖动缩放功能 2.等待更新 总结 前言 Qt第三方…...
JAVA-类与继承
啥是继承? 在JAVA中, 继承就是子类继承父类的特征和行为,使得子类拥有父类的特征和行为,同时还可以拥有父类所没有的特征和行为。 举个例子通俗来讲,兔子和羊是食草动物类,狮子和豹子是食肉动物类&#x…...
SSH连接报错,Corrupted MAC on input 解决方法
问题描述 客户在windows CMD中SSH连接失败,报错: Corrupted MAC on input ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect值得注意的是,客户通过别的机器做SSH连接可以成功,使用putty, mo…...
【C++】8___继承
目录 一、基本语法 二、继承方式 三、对象模型 四、继承中的构造与析构的顺序 五、继承中同名成员处理 六、多继承语法 七、菱形继承 一、基本语法 好处:减少重复的代码 语法: class 子类 : 继承方式 父类 子类 也称为 派生类 父类…...
C# 中的异常处理:构建健壮和可靠的程序
C#中的异常处理(Exception Handling)。异常处理是编程中非常重要的一部分,它允许开发者优雅地处理程序运行时可能出现的错误或意外情况。通过有效的异常处理,可以使应用程序更加健壮、可靠,并提供更好的用户体验。以下…...
基于智能合约的医院凭证共享中心路径探析
一、引言 随着医疗行业的不断发展和信息技术的进步,基于智能合约的医疗凭证共享中心解决方案成为了可能。在当今数字化时代,医疗领域面临着诸多挑战,如医疗数据的分散存储、信息共享的不便捷以及凭证管理的复杂性等问题。而智能合约的出现&am…...
vba学习系列(9)--按需求计数单元格数量
系列文章目录 文章目录 系列文章目录前言一、按需求计数单元格数量1.需求 二、使用步骤1.vba源码2.整理后 总结 前言 一、按需求计数单元格数量 1.需求 一个表中有多个类型的单元格内容,比如:文字、数字、特殊字符、字母数字…… 我们要计数字母数字的…...
scale index的计算
scale index定义 基本实现 需要注意,scale index的提出者分别构建了MATLAB和R语言的实现方式。 但是,需要注意,经过我向作者求证。 MATLAB编写的代码已经“过时了”,为了拥抱时代,作者构建了R语言包,名称为…...
鸿蒙实现Web组件开发
目录: 1、简介&使用场景2、加载网络页面3、加载本地页面4、加载HTML格式的文本数据5、设置深色模式6、上传文件7、在新窗口中打开页面8、管理位置权限 1、简介&使用场景 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全…...
Linux——linux系统移植
创建VSCode工程 1、将NXP官方的linux内核拷贝到Ubuntu 2、解压缩tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 NXP官方开发板Linux内核编译 1、将.vscode文件夹复制到NXP官网linux工程中,屏蔽一些不需要的文件 2、编译NXP官方EVK开发板对应的Linux系统…...
工业摄像头应对复杂环境的策略与解决方案
工业摄像头需应对复杂环境,如极端温度、振动、尘土、光照不足等。为确保稳定工作,它采用了先进技术和设计。详细分析如下: 一、增强环境适应性 采用高灵敏度传感器:使用CMOS或CCD图像传感器,适应低光照条件。 高精度、…...
重生之我在异世界学编程之C语言:深入动态内存管理篇
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 动态内存管理的必要性二 动态…...
【经典论文阅读】Latent Diffusion Models(LDM)
Latent Diffusion Models High-Resolution Image Synthesis with Latent Diffusion Models 摘要 动机:在有限的计算资源下进行扩散模型训练,同时保持质量和灵活性 引入跨注意力层,以卷积方式实现对一般条件输入(如文本或边界框…...
智能指针中的weak_ptr(弱引用智能指针)
弱引用智能指针 std::weak_ptr 可以看做是shared_ptr的助手,它不管理 shared_ptr 内部的指针。std::weak_ptr 没有重载操作符*和->,因为它不共享指针, 不能操作资源,所以它的构造不会增加引用计数,析构也不会减少引用计数,它的…...
【电子通识】机电继电器和固态继电器的区别
机电继电器 机电继电器于19世纪中叶发明。这些器件将线圈与可移动的金属触点结合使用来充当电动开关。这些器件会因为金属触点出现磨损而发生故障,例如焊死在一起。因此,在完全失效之前器件能够进行的开关周期数有限,从而限制了其总体可靠性。 一般情况下继电器控制…...
工业异常检测-CVPR2024-新的3D异常数据合成办法和自监督网络IMRNet
论文:https://arxiv.org/pdf/2311.14897v3.pdf 项目:https://github.com/chopper-233/anomaly-shapenet 这篇论文主要关注的是3D异常检测和定位,这是一个在工业质量检查中至关重要的任务。作者们提出了一种新的方法来合成3D异常数据&#x…...
如何创建对话窗口
文章目录 1. 概念介绍2. 使用方法3. 示例代码我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口,其实我们在上一章回中删除ListView中…...
新手上路,学Go还是Python
对于新手来说,Go和Python都是很好的编程语言,它们各有特点,以下是详细的对比来帮助你决定先学哪一个: 一、语法和学习难度 Python 语法简洁易懂:Python以其简洁、优雅的语法而闻名,代码的可读性很高。例如…...
<!DOCTYPE html>的作用是什么
一、背景 从今天开始会不定时的发布一些前端的常见面试题,供大家参考。今天要发布的内容是关于html的面试题的作用是什么。接下来就一起讨论以下吧 二、概念 DOCTYPE 是html5中一种标准通用标记语言的文档类型的声明,它的目的就是为了告诉浏览器应该以…...
EasyExcel改名为FastExce做了那些改变呢
回到:github原作者地址:https://github.com/CodePhiliaX/fastexcel 中文 |English | 什么是 FastExcel FastExcel 是由原 EasyExcel 作者创建的新项目。2023 年我已从阿里离职,近期阿里宣布停止更新 EasyExcel,作者他本人决定继…...
狗狗的生育周期:关注与呵护
狗狗的繁殖是一个复杂且需要谨慎对待的过程,了解其生产周期对于宠物主人以及从事相关行业的人员至关重要。 一般而言,狗狗的怀孕周期约为两个月左右,但这并非绝对固定。从受孕到分娩,通常在 58 至 65 天之间波动。小型犬可能相对…...
ABAP DIALOG屏幕编程2
在上一篇博客ABAP DIALOG屏幕编程1中阐述了DIALOG、PBO、PAI的概念并且对常用页面元素怎么用进行了演示。在这一篇博文中会讲述怎么添加下拉框、搜索帮助,怎么创建表控件、屏幕跳转等。会用到上一篇里面的内容。 有关程序包含文件结构如下。 一、响应用户指令 如上…...
获取缓存大小与清除 Web 缓存 - 鸿蒙 HarmonyOS Next
针对浏览器 Web 组件清除缓存相关,具体实现如下 code 实例所示: /*公共方法类*/ export class PublicUtils {/*获取缓存大小*/static async getCacheSize(): Promise<number> {try {let bundleStats await storageStatistics.getCurrentBundleStats()let size bundleS…...
在Unreal Engine中,UHT与反射机制
UHT(Unreal Header Tool) 是虚幻引擎(Unreal Engine)中的一个重要工具,它用于处理和生成引擎所需的元数据,使得虚幻引擎能够执行许多复杂的功能,如反射、序列化、蓝图交互、垃圾回收等。简而言之…...
SQL项目实战与综合应用——项目设计与需求分析
项目设计与需求分析是软件开发过程中的核心环节,尤其在涉及数据库的应用时,良好的设计将直接影响到项目的可扩展性、性能和维护性。本文将深入探讨数据库设计的最佳实践,结合 C 与 SQL 的实际应用场景,涵盖项目需求收集、数据库设…...
分布式中的CAP定理和BASE理论与强弱一致性
分布式中的CAP定理和BASE理论与强弱一致性 CAP定理 CAP定理,也称为布鲁尔定理(Brewer’s Theorem),是由加州大学伯克利分校的Eric Brewer教授在2000年提出的,并由麻省理工学院的Seth Gilbert和Nancy Lynch于2002年正…...
C/C++常见符号与运算符
C/C常见符号与运算符对照表 符号用法与意义与Java类比:在条件运算符中 (cond ? x : y) 表示条件为假的分支;在 switch-case 中如 case 1:表示标签结束点;在自定义标签如 label: 中用于 goto 跳转Java中? :三元运算相同;switch-case中也有:…...
了解 k8s 网络基础知识
了解 Docker 网络模式 在使用 Docker run 创建 Docker 容器时,可以使用 --net 选项指定容器的网络模式,Docker 可以有4种网络模式。 host 模式。–nethost 指定和宿主机共用一个 NetWork Namespace,容器中的网络环境(ip 地址、路…...
用户信息界面按钮禁用+发送消息功能
用户信息界面按钮禁用发送消息功能 前言 那么在上一集我们就完成了个人信息窗口所有的内容的修改,那么我们就需要进一步来看我们别的用户的信息界面的窗口。 需求分析 在之前的我们也讲了用户信息界面窗口一共有下图几种组件。 用户头像、用户id、用户昵称、用户…...
怎样给网站或者商品做推广/网站首页排名seo搜索优化
遍历文件夹中的所有子文件夹及子文件使用os.walk()方法非常简单。 语法格式大致如下: os.walk(top[, topdownTrue[, onerrorNone[, followlinksFalse]]]) top – 根目录下的每一个文件夹(包含它自己), 产生3-元组 (dirpath, dirnames, filenames)【文件夹路径, …...
苏州高新区建设局网站管网/360免费建站
在使用linux系统中大多都是通过文本页面输入命令来进行操作,linux默认的shell就是bash,所以我们有必要对shell进行深入了解bash特性:一、命令别名:(自定义命令)alias命令可以用来定义和显示命令的别名。但是使用alias命令定义的别…...
娄底市建设网站/网站seo招聘
以百度文库为例,首先找到我们要插入的参考文献,比如 搜索关键词,然后下需要的论文下面点击引用 得到 点击下面导出链接的EndNote,会下载一个.enw文件 找到此文件并双击打开后即已经导入到EndNote中 如果要在word中使用EndNote&…...
网站怎么加友情链接/韩国热搜榜
https://www.zhihu.com/question/26417244...
聊城做网站推广哪家好/广告优化师培训
1、针对布局加载Xml文件的优化,我们使用了异步Inflate的方式,即AsyncLayoutInflater。它的核心原理是在子线程中对我们的Layout进行加载,而加载完成之后会将View通过Handler发送到主线程来使用。所以不会阻塞我们的主线程,加载的时…...
做cpa建什么网站好/智慧软文网站
主要函数开启线程 CreateThread 需要时时获取或步骤繁琐的建议开启线程 CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)调用写好的函数或者CALL, 这个可以是自定义的参数, 0, NULL); 封装调用call函数。就可以直接使用这个SendTextMessage函数 //************************…...