关系型数据库(1)----MySQL(初阶)

目录

1.mysql

2.mysqld

3.mysql架构

1.连接层

2.核心服务层

3.存储引擎层

4.数据存储层

4.SQL分类

5.MySQL操作库

6.MySQL数据类型

[1. 数值类型](#1. 数值类型)

[2. 日期和时间类型](#2. 日期和时间类型)

[3. 字符串类型](#3. 字符串类型)

[4. 空间类型](#4. 空间类型)

[5. JSON数据类型](#5. JSON数据类型)

7.MySQL表的约束

[1. 主键约束(PRIMARY KEY)](#1. 主键约束(PRIMARY KEY))

[2. 非空约束(NOT NULL)](#2. 非空约束(NOT NULL))

[3. 唯一约束(UNIQUE)](#3. 唯一约束(UNIQUE))

[4. 默认值约束(DEFAULT)](#4. 默认值约束(DEFAULT))

[5. 外键约束(FOREIGN KEY)](#5. 外键约束(FOREIGN KEY))

[6. 检查约束(CHECK)](#6. 检查约束(CHECK))

[7. 自增约束(AUTO_INCREMENT)](#7. 自增约束(AUTO_INCREMENT))

8.MySQL基本查询

[1. 基础查询](#1. 基础查询)

[1.1 选择所有数据](#1.1 选择所有数据)

[1.2 选择特定列](#1.2 选择特定列)

[1.3 带条件的查询](#1.3 带条件的查询)

[1.4 排序查询结果](#1.4 排序查询结果)

[1.5 限制查询结果的数量](#1.5 限制查询结果的数量)

[2. 高级查询](#2. 高级查询)

[2.1 去重查询](#2.1 去重查询)

[2.2 模糊查询](#2.2 模糊查询)

[2.3 逻辑运算符](#2.3 逻辑运算符)

[2.4 聚合函数](#2.4 聚合函数)

[2.5 分组查询](#2.5 分组查询)

[2.6 多表查询](#2.6 多表查询)

[3. 实例](#3. 实例)

9.MySQL内置函数

[1. 数学函数](#1. 数学函数)

[2. 字符串函数](#2. 字符串函数)

[3. 日期和时间函数](#3. 日期和时间函数)

[4. 聚合函数](#4. 聚合函数)

[5. 其他函数](#5. 其他函数)

10.MySQL复合查询

[1. 复合查询](#1. 复合查询)

[2. 表的内外链接](#2. 表的内外链接)

11.MySQL索引

[1. 索引概述](#1. 索引概述)

[2. 索引类型](#2. 索引类型)

[3. 索引的创建与维护](#3. 索引的创建与维护)

[4. 索引优化](#4. 索引优化)

12.MySQL事务

[1. 事务概述](#1. 事务概述)

[2. 事务的启动与提交](#2. 事务的启动与提交)

[3. 事务的隔离级别](#3. 事务的隔离级别)

[4. 保存点(Savepoint)](#4. 保存点(Savepoint))

[5. 锁机制](#5. 锁机制)

[6. 事务日志](#6. 事务日志)

[7. 分布式事务](#7. 分布式事务)

13.MySQL视图

[1. 视图概述](#1. 视图概述)

[2. 创建视图](#2. 创建视图)

[3. 查询视图](#3. 查询视图)

[4. 更新视图](#4. 更新视图)

[5. 修改视图](#5. 修改视图)

[6. 删除视图](#6. 删除视图)

[7. 视图的优点](#7. 视图的优点)

[8. 视图的缺点](#8. 视图的缺点)

[9. 视图的类型](#9. 视图的类型)

14.MySQL用户管理

[1. 创建用户](#1. 创建用户)

[2. 授权](#2. 授权)

[3. 修改用户权限](#3. 修改用户权限)

[4. 修改用户密码](#4. 修改用户密码)

[5. 删除用户](#5. 删除用户)

[6. 查看用户权限](#6. 查看用户权限)

[7. 用户管理最佳实践](#7. 用户管理最佳实践)

15.MySQL连接池

[1. 连接池的概念](#1. 连接池的概念)

[2. 连接池的优势](#2. 连接池的优势)

[3. 连接池的实现方式](#3. 连接池的实现方式)

[4. 连接池的配置参数](#4. 连接池的配置参数)

[5. 连接池的使用场景](#5. 连接池的使用场景)

[6. 连接池的注意事项](#6. 连接池的注意事项)


1.mysql

MySQL 是一种开源的关系型数据库管理系统(RDBMS),由瑞典 MySQL AB 公司开发,目前由 Oracle 公司维护。它是全球最受欢迎的数据库之一,被广泛应用于 Web 应用程序、企业应用程序和移动应用程序等领域

  • 开源免费:MySQL 是开源的,可以免费使用,对于个人和小型企业来说非常有吸引力。
  • 高可靠性:具备自动故障转移和数据恢复功能,确保数据的安全性和完整性。
  • 高性能:能够处理大量数据和高并发访问请求,支持多线程操作和多用户并发访问。
  • 简单易用:安装、配置和使用都非常简单,适合初学者。
  • 可扩展性:可以通过添加插件、扩展模块和自定义函数等方式进行扩展。
  • 跨平台支持:支持多种操作系统,包括 Linux、Windows、macOS 等。
  • 多编程语言支持:支持 Java、PHP、Python 等多种编程语言,方便集成到不同的应用程序中。

2.mysqld

mysqld 也称为 MySQL 服务器,是 MySQL 安装中的主要程序。它是一个单一的多线程程序,负责管理对 MySQL 数据目录的访问,该目录包含数据库和表。此外,mysqld 还管理日志文件和状态文件等其他信息。

  • 功能角色

    • MySQL:通常指的是整个 MySQL 数据库管理系统,包括服务器端和客户端工具。
    • mysqld:特指 MySQL 的服务器端程序,负责处理数据库的读写请求,管理数据存储和访问。
  • 程序类型

    • MySQL :包括多种工具和应用程序,例如 mysql(命令行客户端工具),mysqladmin(管理工具)等。
    • mysqld:是 MySQL 服务器的守护进程,后台运行,不产生额外的进程。
  • 启动方式

    • MySQL:通过不同的命令行工具和客户端程序与服务器进行交互。
    • mysqld :通过 mysqld 命令启动 MySQL 服务。在 Linux 系统中,可以使用 sudo /etc/init.d/mysql start 命令启动服务;在 Windows 系统中,可以使用 net start mysql 命令启动服务。
  • 交互方式

    • MySQL :用户可以通过 mysql 命令行工具连接到 MySQL 服务器并执行 SQL 命令。
    • mysqld:作为服务器端程序,不直接与用户交互,而是响应客户端的连接请求和管理数据库访问。

3.mysql架构

1.连接层

连接层是 MySQL 架构的最上层,负责处理客户端与 MySQL 服务器的连接。这一层主要包括以下组件:

  • 连接器(Connectors):不同语言(如 PHP、Java、Python 等)通过连接器与 MySQL 进行交互。连接器负责建立和管理客户端与 MySQL 服务器之间的连接,并进行身份验证和安全检查。

2.核心服务层

核心服务层是 MySQL 的中间层,包含了 MySQL 大部分的核心功能。这一层主要分为以下几个部分:

  • 查询缓存(Query Cache):在解析 SQL 语句之前,MySQL 会检查查询缓存中是否已有该查询的结果。如果有,则直接返回结果,无需再次执行查询。
  • 分析器(Parser):分析器负责解析 SQL 语句,将其分解为 MySQL 可以理解的逻辑结构。分析过程中会检查 SQL 语句的语法是否正确。
  • 优化器(Optimizer):优化器对 SQL 语句进行优化,选择最有效的执行计划。优化器会考虑多种执行策略,并选择成本最低的方案。
  • 执行器(Executor):执行器根据优化器生成的执行计划执行 SQL 语句。执行器会调用存储引擎 API 来访问数据。
  • 管理服务和工具(Management Services & Utilities):包括系统管理和控制工具,例如备份恢复、MySQL 复制、集群管理等。
  • SQL 接口(SQL Interface):提供 SQL 命令的接口,包括内置函数(日期、时间、数学和加密函数等)和跨存储引擎的功能(如存储过程、触发器、视图等)。

3.存储引擎层

存储引擎层是 MySQL 的底层,负责数据的存储和提取。MySQL 支持多种存储引擎,每种引擎都有其独特的优势和劣势。常见的存储引擎包括:

  • InnoDB:支持事务处理、行级锁定和外键约束,是 MySQL 5.5 之后默认的存储引擎。
  • MyISAM:不支持事务处理和行级锁定,但读取速度快,适合读多写少的场景。
  • Memory:将数据存储在内存中,访问速度快,但数据易丢失。

4.数据存储层

数据存储层负责将数据持久化存储在文件系统上,并与存储引擎进行交互。这一层主要包括各种日志文件、数据文件和索引文件。

4.SQL分类

  1. 数据查询语言(DQL - Data Query Language)

    • 主要用于查询数据库中的数据。
    • 常用的DQL命令包括SELECT
  2. 数据操纵语言(DML - Data Manipulation Language)

    • 主要用于对数据库中的数据进行操作,如插入、更新和删除。
    • 常用的DML命令包括INSERTUPDATEDELETE
  3. 数据定义语言(DDL - Data Definition Language)

    • 主要用于定义数据库的结构,如创建、修改和删除数据库中的表、索引等。
    • 常用的DDL命令包括CREATEALTERDROP
  4. 数据控制语言(DCL - Data Control Language)

    • 主要用于控制不同数据对象之间的访问权限。
    • 常用的DCL命令包括GRANTREVOKE
  5. 事务控制语言(TCL - Transaction Control Language)

    • 主要用于处理数据库中的事务,确保数据的完整性和一致性。
    • 常用的TCL命令包括COMMITROLLBACKSAVEPOINT
  6. 会话控制语言(SCL - Session Control Language)

    • 主要用于设置会话级别的参数,如设置字符集、时区等。
    • 常用的SCL命令包括SET
  7. 指针控制语言(PCL - Pointer Control Language)

    • 主要用于控制游标(cursor)的操作,如打开、关闭、移动游标等。
    • 常用的PCL命令包括DECLARE CURSOROPENFETCHCLOSE
  8. 元数据定义语言(MDL - Metadata Definition Language)

    • 主要用于定义数据库的元数据,如创建、修改和删除数据库中的视图、存储过程等。
    • 常用的MDL命令包括CREATE VIEWALTER VIEWDROP VIEW

5.MySQL操作库

  1. 创建数据库

    • 命令:CREATE DATABASE 数据库名;
    • 示例:CREATE DATABASE mydatabase;
  2. 删除数据库

    • 命令:DROP DATABASE 数据库名;
    • 示例:DROP DATABASE mydatabase;
  3. 修改数据库

    • 修改数据库的字符集和排序规则:ALTER DATABASE 数据库名 DEFAULT CHARACTER SET 编码格式 DEFAULT COLLATE 排序规则;
    • 示例:ALTER DATABASE mydatabase DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
  4. 查看数据库

    • 查看当前服务器上的所有数据库:SHOW DATABASES;SHOW SCHEMAS;
    • 选择某个数据库:USE 数据库名;
  5. 其他操作

    • 修改数据库的存储引擎:ALTER DATABASE 数据库名 ENGINE = 存储引擎名;
    • 示例:ALTER DATABASE mydatabase ENGINE = InnoDB;

6.MySQL数据类型

1. 数值类型

MySQL支持所有标准SQL数值数据类型,包括严格数值数据类型和近似数值数据类型:

  • 严格数值数据类型

    • INTEGER:有符号范围从-2^31到2^31-1,无符号范围从0到2^32-1。
    • SMALLINT:有符号范围从-2^15到2^15-1,无符号范围从0到2^16-1。
    • MEDIUMINT:有符号范围从-2^23到2^23-1,无符号范围从0到2^24-1。
    • BIGINT:有符号范围从-2^63到2^63-1,无符号范围从0到2^64-1。
    • DECIMALNUMERIC:用于存储精确的小数值。
  • 近似数值数据类型

    • FLOAT:单精度浮点数。
    • DOUBLE:双精度浮点数。
  • 其他数值类型

    • TINYINT:有符号范围从-128到127,无符号范围从0到255。
    • BIT:用于存储位字段值。

2. 日期和时间类型

表示时间值的日期和时间类型包括:

  • DATE:存储日期,格式为YYYY-MM-DD。
  • TIME:存储时间,格式为HH:MM:SS。
  • DATETIME:存储日期和时间,格式为YYYY-MM-DD HH:MM:SS。
  • TIMESTAMP:存储时间戳,格式为YYYY-MM-DD HH:MM:SS。
  • YEAR:存储年份,格式为YYYY。

3. 字符串类型

字符串类型包括:

  • CHAR:定长字符串。
  • VARCHAR:变长字符串。
  • BINARY:定长二进制字符串。
  • VARBINARY:变长二进制字符串。
  • BLOB:二进制大对象。
  • TEXT:文本大对象。
  • ENUM:枚举类型,只能有一个值,从定义的列表中选择。
  • SET:集合类型,可以包含多个值,从定义的列表中选择。

4. 空间类型

用于存储空间数据:

  • GEOMETRYPOINTLINESTRINGPOLYGONMULTIPOINTMULTILINESTRINGMULTIPOLYGONGEOMETRYCOLLECTION

5. JSON数据类型

用于存储JSON文档。

7.MySQL表的约束

MySQL中的表约束用于限制和规范表中数据的完整性。这些约束确保了数据的准确性和可靠性。MySQL支持的表约束主要包括以下几种:

1. 主键约束(PRIMARY KEY)

主键约束用于唯一标识表中的每条记录。一个表只能有一个主键,并且主键中的列不能包含NULL值。

2. 非空约束(NOT NULL)

非空约束确保列中不能有NULL值,即该列必须包含一个值。

3. 唯一约束(UNIQUE)

唯一约束确保列中的所有值都是唯一的。一个表可以有多个唯一约束。

4. 默认值约束(DEFAULT)

默认值约束为列提供一个默认值,当插入数据时,如果没有为该列提供值,则使用默认值。

5. 外键约束(FOREIGN KEY)

外键约束用于建立和维护两个表之间的关联。外键约束要求外键列的值必须在被引用的表中存在。

6. 检查约束(CHECK)

检查约束用于确保列中的值满足特定的条件。MySQL 8.0.16开始支持检查约束。

7. 自增约束(AUTO_INCREMENT)

自增约束用于为整数类型的列自动生成唯一的递增值。通常与主键约束一起使用。

8.MySQL基本查询

1. 基础查询

1.1 选择所有数据

sql 复制代码
SELECT * FROM 表名;

例如:

sql 复制代码
SELECT * FROM users;

1.2 选择特定列

sql 复制代码
SELECT 列名1, 列名2 FROM 表名;

例如:

sql 复制代码
SELECT username, email FROM users;

1.3 带条件的查询

sql 复制代码
SELECT * FROM 表名 WHERE 条件;

例如:

sql 复制代码
SELECT * FROM users WHERE isactive = TRUE;

1.4 排序查询结果

sql 复制代码
SELECT * FROM 表名 ORDER BY 列名 [ASC|DESC];

例如:

sql 复制代码
SELECT * FROM users ORDER BY birthdate DESC;

1.5 限制查询结果的数量

sql 复制代码
SELECT * FROM 表名 LIMIT 数量;

例如:

sql 复制代码
SELECT * FROM users LIMIT 10;

2. 高级查询

2.1 去重查询

sql 复制代码
SELECT DISTINCT 列名 FROM 表名;

例如:

sql 复制代码
SELECT DISTINCT name FROM students;

2.2 模糊查询

sql 复制代码
SELECT * FROM 表名 WHERE 列名 LIKE '模糊字符串';

例如:

sql 复制代码
SELECT * FROM students WHERE name LIKE '%张%';

2.3 逻辑运算符

sql 复制代码
SELECT * FROM 表名 WHERE 条件1 AND/OR 条件2;

例如:

sql 复制代码
SELECT * FROM students WHERE age > 15 OR sex = 'man';

2.4 聚合函数

sql 复制代码
SELECT 聚合函数(列名) FROM 表名;

例如:

sql 复制代码
SELECT COUNT(*) FROM students;

2.5 分组查询

sql 复制代码
SELECT 列名1, 聚合函数(列名2) FROM 表名 GROUP BY 列名1;

例如:

sql 复制代码
SELECT sex, COUNT(*) FROM students GROUP BY sex;

2.6 多表查询

sql 复制代码
SELECT 列名1, 列名2 FROM 表名1, 表名2 WHERE 条件;

例如:

sql 复制代码
SELECT users.username, orders.order_date FROM users, orders WHERE users.id = orders.user_id;

3. 实例

以下是一些具体的实例:

  • 选择所有列的所有行:

    sql 复制代码
    SELECT * FROM users;
  • 选择特定列的所有行:

    sql 复制代码
    SELECT username, email FROM users;
  • 添加 WHERE 子句,选择满足条件的行:

    sql 复制代码
    SELECT * FROM users WHERE isactive = TRUE;
  • 添加 ORDER BY 子句,按照某列的升序排序:

    sql 复制代码
    SELECT * FROM users ORDER BY birthdate;
  • 添加 ORDER BY 子句,按照某列的降序排序:

    sql 复制代码
    SELECT * FROM users ORDER BY birthdate DESC;
  • 添加 LIMIT 子句,限制返回的行数:

    sql 复制代码
    SELECT * FROM users LIMIT 10;
  • 使用 AND 运算符和通配符:

    sql 复制代码
    SELECT * FROM users WHERE username LIKE 'j%' AND isactive = TRUE;
  • 使用 OR 运算符:

    sql 复制代码
    SELECT * FROM users WHERE isactive = TRUE OR birthdate < '1990-01-01';

9.MySQL内置函数

1. 数学函数

  • ABS(x): 返回x的绝对值。

    sql 复制代码
    SELECT ABS(-1); -- 返回 1
  • CEIL(x): 返回大于或等于x的最小整数。

    sql 复制代码
    SELECT CEIL(1.2); -- 返回 2
  • FLOOR(x): 返回小于或等于x的最大整数。

    sql 复制代码
    SELECT FLOOR(1.2); -- 返回 1
  • ROUND(x, [y]): 返回x的四舍五入值,y指定小数点后的位数。

    sql 复制代码
    SELECT ROUND(1.234, 2); -- 返回 1.23

2. 字符串函数

  • CONCAT(str1, str2, ...): 将字符串连接起来。

    sql 复制代码
    SELECT CONCAT('Hello', ' ', 'World'); -- 返回 'Hello World'
  • LEFT(str, x): 返回字符串str的最左边x个字符。

    sql 复制代码
    SELECT LEFT('Hello World', 5); -- 返回 'Hello'
  • RIGHT(str, x): 返回字符串str的最右边x个字符。

    sql 复制代码
    SELECT RIGHT('Hello World', 5); -- 返回 'World'
  • SUBSTRING(str, x, y): 返回字符串str中从第x个字符开始的y个字符。

    sql 复制代码
    SELECT SUBSTRING('Hello World', 7, 5); -- 返回 'World'

3. 日期和时间函数

  • CURRENT_DATE: 返回当前日期。

    sql 复制代码
    SELECT CURRENT_DATE; -- 返回 '2024-10-25'
  • CURRENT_TIME: 返回当前时间。

    sql 复制代码
    SELECT CURRENT_TIME; -- 返回 '14:45:00'
  • CURRENT_TIMESTAMP: 返回当前日期和时间。

    sql 复制代码
    SELECT CURRENT_TIMESTAMP; -- 返回 '2024-10-25 14:45:00'
  • DATE_ADD(date, INTERVAL x [unit]): 向日期date添加指定的时间间隔。

    sql 复制代码
    SELECT DATE_ADD('2024-10-25', INTERVAL 1 DAY); -- 返回 '2024-10-26'

4. 聚合函数

  • COUNT(x): 返回x的非NULL值的数量。

    sql 复制代码
    SELECT COUNT(*) FROM users;
  • SUM(x): 返回x的总和。

    sql 复制代码
    SELECT SUM(age) FROM users;
  • AVG(x): 返回x的平均值。

    sql 复制代码
    SELECT AVG(age) FROM users;
  • MAX(x): 返回x的最大值。

    sql 复制代码
    SELECT MAX(age) FROM users;
  • MIN(x): 返回x的最小值。

    sql 复制代码
    SELECT MIN(age) FROM users;

5. 其他函数

  • IF(condition, true_value, false_value): 如果条件为真,返回true_value,否则返回false_value。

    sql 复制代码
    SELECT IF(1 > 0, 'TRUE', 'FALSE'); -- 返回 'TRUE'
  • CASE: 根据条件返回不同的值。

    sql 复制代码
    SELECT CASE
      WHEN age > 30 THEN 'Old'
      WHEN age BETWEEN 20 AND 30 THEN 'Middle'
      ELSE 'Young'
    END AS age_group FROM users;

10.MySQL复合查询

1. 复合查询

复合查询通常包括以下几种类型:

  • UNION: 合并两个或多个SELECT语句的结果集,并去除重复的行。

    sql 复制代码
    SELECT column_name(s) FROM table1
    UNION
    SELECT column_name(s) FROM table2;

    注意: UNION默认会去除重复的行。如果需要保留重复的行,可以使用UNION ALL。

  • UNION ALL: 合并两个或多个SELECT语句的结果集,并保留重复的行。

    sql 复制代码
    SELECT column_name(s) FROM table1
    UNION ALL
    SELECT column_name(s) FROM table2;
  • INTERSECT: 返回两个SELECT语句结果集的交集。

    sql 复制代码
    SELECT column_name(s) FROM table1
    INTERSECT
    SELECT column_name(s) FROM table2;
  • MINUS (或 EXCEPT): 返回第一个SELECT语句结果集中存在而第二个SELECT语句结果集中不存在的行。

    sql 复制代码
    SELECT column_name(s) FROM table1
    MINUS
    SELECT column_name(s) FROM table2;

2. 表的内外链接

表的内外链接用于连接多个表,并根据连接条件返回结果。以下是几种常见的连接类型:

  • INNER JOIN: 返回两个表中的匹配行。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    INNER JOIN table2
    ON table1.column_name = table2.column_name;
  • LEFT JOIN (或 LEFT OUTER JOIN): 返回左表中的所有行,即使在右表中没有匹配的行。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    LEFT JOIN table2
    ON table1.column_name = table2.column_name;
  • RIGHT JOIN (或 RIGHT OUTER JOIN): 返回右表中的所有行,即使在左表中没有匹配的行。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    RIGHT JOIN table2
    ON table1.column_name = table2.column_name;
  • FULL JOIN (或 FULL OUTER JOIN): 返回两个表中的所有行,即使没有匹配的行。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    FULL JOIN table2
    ON table1.column_name = table2.column_name;
  • CROSS JOIN: 返回两个表中的所有可能的组合。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    CROSS JOIN table2;
  • NATURAL JOIN: 基于两个表中的相同名称和类型的列进行连接。

    sql 复制代码
    SELECT column_name(s)
    FROM table1
    NATURAL JOIN table2;

11.MySQL索引

1. 索引概述

索引是一个排序的列表,存储着索引的值和包含该值的数据所在行的物理地址。索引的作用类似于书的目录,可以根据目录中的页码快速找到所需内容。在MySQL中,索引通常以B-Tree结构存储,能够保持数据有序,从而加快查询速度12。

2. 索引类型

MySQL支持多种索引类型,每种类型都有其适用场景:

  • 主键索引(PRIMARY KEY):当某个列被设为主键时,该列就是主键索引。主键索引保证列中的数据唯一且非空。

    sql 复制代码
    CREATE TABLE a (
      id INT PRIMARY KEY AUTO_INCREMENT,
      name VARCHAR(20) NOT NULL DEFAULT ''
    );
  • 唯一索引(UNIQUE INDEX):索引列中的值必须是唯一的,但允许NULL值。

    sql 复制代码
    CREATE UNIQUE INDEX 索引名 ON table_name(column_name);
  • 普通索引(NORMAL INDEX):没有任何限制,允许在定义索引的列中插入重复值和NULL值。

    sql 复制代码
    CREATE INDEX 索引名 ON table_name(column_name);
  • 全文索引(FULLTEXT INDEX):主要用于快速检索大文本数据中的关键字信息。

    sql 复制代码
    CREATE FULLTEXT INDEX 索引名 ON table_name(column_name);
  • 前缀索引:在文本类型如BLOB、TEXT或很长的VARCHAR列上创建索引时,可以使用前缀索引,数据量相比普通索引更小。

    sql 复制代码
    CREATE INDEX 索引名 ON table_name(column_name(length));
  • 组合索引:在多个字段上创建的索引,查询条件中使用了创建索引时的第一个字段时,索引才会被使用。

    sql 复制代码
    CREATE INDEX 索引名 ON table_name(column1, column2);
  • 空间索引:MySQL在5.7之后的版本支持了空间索引,支持OpenGIS几何数据模型。

    sql 复制代码
    CREATE SPATIAL INDEX 索引名 ON table_name(column_name);

3. 索引的创建与维护

创建索引可以在建表时同步进行,也可以后续手动创建。索引的更新可以通过重命名或删除旧索引实现,删除索引使用DROP INDEX语句34。

4. 索引优化

索引优化是提升数据库性能的重要手段。以下是一些索引优化的最佳实践:

  • 选择合适的索引类型:根据查询需求选择最合适的索引类型,如B-Tree、Hash、Fulltext等。

  • 避免过度索引:过多的索引会占用额外的磁盘空间,并增加维护成本。

  • 使用EXPLAIN分析查询:通过EXPLAIN命令分析SQL语句的执行计划和性能,优化查询语句。

    sql 复制代码
    EXPLAIN SELECT * FROM table_name WHERE column_name = 'value';
  • 索引列的选择:选择经常用于查询条件的列创建索引,以提高查询效率

12.MySQL事务

MySQL事务是数据库操作中非常重要的一部分,它确保了数据的一致性和完整性。以下是对MySQL事务的详细介绍:

1. 事务概述

事务是一组操作的集合,这些操作要么全部执行成功,要么全部失败。事务具有以下四个特性(ACID):

  • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个环节。
  • 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态转变到另一个一致性状态。
  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就是永久性的,即便在系统发生故障的情况下也不会丢失。

2. 事务的启动与提交

在MySQL中,事务的启动和提交可以通过以下命令实现:

  • 启动事务 :默认情况下,MySQL的每个语句都是自动提交的。要启动一个事务,可以使用START TRANSACTIONBEGIN命令。

    sql 复制代码
    START TRANSACTION;
    -- 或者
    BEGIN;
  • 提交事务 :当事务中的所有操作都成功完成后,使用COMMIT命令提交事务,使更改永久生效。

    sql 复制代码
    COMMIT;
  • 回滚事务 :如果在事务执行过程中出现错误,可以使用ROLLBACK命令回滚事务,撤销所有未提交的更改。

    sql 复制代码
    ROLLBACK;

3. 事务的隔离级别

MySQL支持多种事务隔离级别,不同的隔离级别会影响事务的并发性能和数据一致性。隔离级别包括:

  • 读未提交(READ UNCOMMITTED):允许读取未提交的数据,可能会导致脏读、不可重复读和幻读。
  • 读已提交(READ COMMITTED):只能读取已提交的数据,可以避免脏读,但可能会出现不可重复读和幻读。
  • 可重复读(REPEATABLE READ):在一个事务中多次读取同一记录,结果都是相同的,可以避免脏读和不可重复读,但可能会出现幻读。
  • 串行化(SERIALIZABLE):事务串行执行,可以避免脏读、不可重复读和幻读,但并发性能最低。

在MySQL中,可以通过以下命令设置事务的隔离级别:

sql 复制代码
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;

4. 保存点(Savepoint)

保存点允许在事务中设置一个标记,如果事务需要回滚,可以回滚到指定的保存点,而不是整个事务。使用SAVEPOINT命令设置保存点,使用ROLLBACK TO SAVEPOINT命令回滚到保存点。

5. 锁机制

MySQL中的事务通过锁机制来保证数据的一致性和隔离性。锁分为共享锁(读锁)和排他锁(写锁),不同的锁类型和锁粒度(行锁、表锁)会影响事务的并发性能。

6. 事务日志

事务日志记录了事务对数据库的修改,用于事务的回滚和恢复。MySQL支持两种事务日志:二进制日志(Binary Log)和InnoDB事务日志。

7. 分布式事务

在分布式数据库系统中,分布式事务确保了跨多个节点的事务的一致性。MySQL支持分布式事务,但需要使用特定的分布式事务管理器。

13.MySQL视图

MySQL视图(View)是一个虚拟表,其内容是从一个或多个表中派生出来的。视图可以包含表中的全部或部分数据,并且可以根据需要显示或隐藏数据。视图不存储数据,其数据仍然存储在原始表中。以下是关于MySQL视图的详细介绍:

1. 视图概述

视图是数据库中的一个重要对象,主要用于简化数据查询、提供数据安全性、集中数据管理和简化数据操作。视图可以基于一个表,也可以基于多个表。

2. 创建视图

在MySQL中,可以使用CREATE VIEW语句创建视图。基本语法如下:

sql 复制代码
CREATE VIEW 视图名称 AS 查询语句;

例如,创建一个基于employees表的视图,只包含员工姓名和部门:

sql 复制代码
CREATE VIEW employee_details AS
SELECT name, department
FROM employees;

3. 查询视图

创建视图后,可以使用SELECT语句查询视图,就像查询普通表一样:

sql 复制代码
SELECT * FROM employee_details;

4. 更新视图

在MySQL中,可以通过UPDATEINSERTDELETE语句更新视图中的数据。但是,更新视图有一些限制,例如,如果视图是基于多个表创建的,或者包含聚合函数、子查询等,则可能无法更新视图。

5. 修改视图

可以使用ALTER VIEW语句修改视图的定义:

sql 复制代码
ALTER VIEW 视图名称 AS 查询语句;

6. 删除视图

使用DROP VIEW语句删除视图:

sql 复制代码
DROP VIEW 视图名称;

7. 视图的优点

  • 简化数据查询:视图可以简化复杂的查询语句,使数据查询更易于理解和使用。
  • 提供数据安全性:视图可以限制用户对数据的访问,只显示特定的数据列或行。
  • 集中数据管理:视图可以将多个表中的数据集中到一个视图中,方便数据管理和维护。
  • 简化数据操作:视图可以简化数据操作,例如,通过视图可以方便地对多个表进行联合查询。

8. 视图的缺点

  • 性能影响:视图不存储数据,每次查询视图时都需要执行视图定义的查询语句,可能会影响查询性能。
  • 更新限制:更新视图有一些限制,可能无法更新所有类型的视图。

9. 视图的类型

  • 简单视图:基于单个表的视图。
  • 复杂视图:基于多个表或包含聚合函数、子查询等复杂查询的视图。

14.MySQL用户管理

1. 创建用户

在MySQL中,可以使用CREATE USER语句创建新用户。基本语法如下:

sql 复制代码
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';

例如,创建一个名为user1的用户,密码为password,只能从本地主机登录:

sql 复制代码
CREATE USER 'user1'@'localhost' IDENTIFIED BY 'password';

2. 授权

创建用户后,需要为用户授权。可以使用GRANT语句为用户授予权限。基本语法如下:

sql 复制代码
GRANT 权限 ON 数据库名.表名 TO '用户名'@'主机名';

例如,为user1用户授予权限,使其可以查询employees表:

sql 复制代码
GRANT SELECT ON mydatabase.employees TO 'user1'@'localhost';

3. 修改用户权限

可以使用GRANT语句修改用户的权限,或者使用REVOKE语句撤销用户的权限。例如,撤销user1用户的查询权限:

sql 复制代码
REVOKE SELECT ON mydatabase.employees FROM 'user1'@'localhost';

4. 修改用户密码

可以使用ALTER USER语句修改用户的密码。基本语法如下:

sql 复制代码
ALTER USER '用户名'@'主机名' IDENTIFIED BY '新密码';

例如,修改user1用户的密码为newpassword

sql 复制代码
ALTER USER 'user1'@'localhost' IDENTIFIED BY 'newpassword';

5. 删除用户

可以使用DROP USER语句删除用户。基本语法如下:

sql 复制代码
DROP USER '用户名'@'主机名';

例如,删除user1用户:

sql 复制代码
DROP USER 'user1'@'localhost';

6. 查看用户权限

可以使用SHOW GRANTS语句查看用户的权限。基本语法如下:

sql 复制代码
SHOW GRANTS FOR '用户名'@'主机名';

例如,查看user1用户的权限:

sql 复制代码
SHOW GRANTS FOR 'user1'@'localhost';

7. 用户管理最佳实践

  • 最小权限原则:只为用户授予必要的权限,避免授予过多的权限。
  • 定期审查权限:定期审查用户的权限,确保权限设置合理。
  • 使用强密码:为用户设置强密码,并定期更换密码。
  • 限制登录主机:限制用户只能从特定的主机登录数据库。

15.MySQL连接池

MySQL连接池是一种数据库连接管理技术,它通过预先创建和复用数据库连接来减少连接建立和销毁的开销。连接池可以提高数据库操作的性能和效率,特别是在高并发环境下。以下是MySQL连接池的详细介绍:

1. 连接池的概念

连接池是一种管理数据库连接的机制,它允许应用程序在需要时从池中获取连接,并在使用完毕后释放回池中。这样可以避免频繁地创建和销毁连接,从而提高性能。

2. 连接池的优势

  • 性能提升:通过复用连接,减少了连接建立和销毁的开销。
  • 资源节约:减少了数据库服务器的连接数,降低了资源消耗。
  • 并发处理:能够处理高并发请求,提高应用程序的响应速度。

3. 连接池的实现方式

连接池的实现方式有多种,常见的有:

  • 内置连接池:如MySQL Connector/J(Java)、MySQL Connector/C++等。
  • 第三方连接池:如Apache DBCP、C3P0、HikariCP等。
  • 自定义连接池:根据特定需求自行实现。

4. 连接池的配置参数

连接池的配置参数通常包括:

  • 最大连接数:连接池中允许的最大连接数。
  • 最小连接数:连接池中保持的最小连接数。
  • 连接超时时间:获取连接的超时时间。
  • 空闲连接回收时间:回收空闲连接的时间间隔。
  • 连接验证:验证连接是否有效的策略。

5. 连接池的使用场景

连接池适用于以下场景:

  • 高并发应用:如Web应用、移动应用等。
  • 频繁数据库操作:如OLTP(联机事务处理)系统。
  • 资源受限环境:如云数据库、共享数据库等。

6. 连接池的注意事项

  • 连接泄露:确保所有连接在使用后都能正确释放。
  • 连接池大小:合理配置连接池大小,避免过大或过小。
  • 连接验证:定期验证连接的有效性,避免无效连接。
  • 异常处理:妥善处理数据库操作中可能出现的异常。
相关推荐
幽兰的天空33 分钟前
python实现excel数据导入数据库
数据库
昨天今天明天好多天2 小时前
【Linux】MySQL部署
linux·mysql·adb
我还能再卷一点2 小时前
Linux安装mysql【超详细】
linux·mysql·adb
尘佑不尘2 小时前
shodan5,参数使用,批量查找Mongodb未授权登录,jenkins批量挖掘
数据库·笔记·mongodb·web安全·jenkins·1024程序员节
传输能手2 小时前
从三方云服务器将数据迁移至本地,如何保障安全高效?
大数据·服务器·数据库
BinTools图尔兹2 小时前
CQ社区版 v2024.10 | 支持k8s、helm部署!
数据库·安全·k8s·helm·数据安全·数据库管理员
北笙··3 小时前
Redis慢查询分析优化
数据库·redis·缓存
p-knowledge3 小时前
redis的三种客户端
数据库·redis·缓存
积水成江3 小时前
Redis相关面试题
数据库·redis·缓存
bigcarp3 小时前
Django ORM 数据库管理 提高查询、更新性能的技巧和编程习惯:
数据库·python·django