目录
[一、MySQL 数据库基础](#一、MySQL 数据库基础)
[(一)SQL 语言概述](#(一)SQL 语言概述)
[(二)MySQL 系统数据库](#(二)MySQL 系统数据库)
[二、MySQL 库操作](#二、MySQL 库操作)
[三、MySQL 表操作](#三、MySQL 表操作)
[四、MySQL 数据操作](#四、MySQL 数据操作)
[五、MySQL 用户授权](#五、MySQL 用户授权)
[九、存储引擎:选择适合的数据库 "引擎"](#九、存储引擎:选择适合的数据库 “引擎”)
[十、性能优化:让 MySQL 跑得更快](#十、性能优化:让 MySQL 跑得更快)
一、MySQL 数据库基础
(一)SQL 语言概述
SQL(Structured Query Language)即结构化查询语言,是操作数据库的标准指令集。它由 DDL、DML、DQL 和 DCL 四部分组成。
DDL(数据定义语言) :用于创建、修改和删除数据库及数据库对象,像CREATE
(创建)、ALTER
(修改)、DROP
(删除)语句。比如CREATE DATABASE db1;
就是创建名为db1
的数据库。
DML(数据操纵语言) :负责插入、删除和修改数据库中的数据,常见语句有INSERT
(插入)、UPDATE
(更新)、DELETE
(删除) 。例如INSERT INTO t1 VALUES (1, '张三', 18);
向t1
表插入一条记录。
DQL(数据查询语言) :用来查询数据库中的数据,SELECT
语句是其核心。例如SELECT * FROM renyuan;
可查询renyuan
表的所有数据。
DCL(数据控制语言) :用于控制数据库组件的存取许可和权限,如GRANT
(授权)、REVOKE
(撤销授权) 。例如GRANT SELECT ON test.* TO 'xiaoqi'@'localhost';
赋予xiaoqi
用户对test
数据库所有表的查询权限。
(二)MySQL 系统数据库
MySQL 服务器初始化后,会默认创建四个系统数据库:
数据库名称 | 类型 | 特点 | 存储或记录内容 | 作用 |
---|---|---|---|---|
information_schema | 虚拟库 | 不占磁盘空间 | 数据库启动后的参数,如用户表、列、权限、字符等信息 | 为数据库运行提供元数据支持,方便查询数据库结构等信息 |
performance_schema | 常规数据库 | 自 MySQL 5.5 新增 | 数据库服务器性能参数,查询请求时的事件、锁等现象 | 用于分析数据库性能瓶颈,优化服务器性能 |
mysql | 授权库 | - | 系统用户的权限信息 | 管理数据库用户权限,保障数据库安全访问 |
sys | 常规数据库 | - | 系统性能信息和监控数据 | 辅助数据库性能优化,快速定位和解决故障 |
二、MySQL 库操作
(一)创建数据库
使用CREATE DATABASE
语句创建数据库,语法为CREATE DATABASE 数据库名;
。例如CREATE DATABASE db1;
,执行后会创建名为db1
的数据库。
(二)数据库命名规则
可由字母、数字、下划线、@、#、$ 组成。
区分大小写。
名称具有唯一性。
不能使用
create
、select
等关键字。不能单独使用数字。
最长 128 位。
(三)选择数据库
用USE
语句选择数据库,语法是USE 数据库名;
。比如USE db1;
可切换到db1
数据库。
(四)查看数据库
show databases;
:查看当前所有数据库。
show create database 数据库名;
:显示创建指定数据库时的 SQL 语句。
select database();
:返回当前选中的数据库名称。
(五)删除数据库
使用DROP DATABASE
语句删除数据库,语法为DROP DATABASE 数据库名;
。例如DROP DATABASE db1;
可删除db1
数据库。
三、MySQL 表操作
(一)表的基本概念
数据库中的库类似文件夹,表类似文件,表中的一条记录像文件的一行内容,且每条记录都有对应的字段。例如,在员工信息表中,id
、name
、age
等就是字段 。
(二)查看表
使用SHOW TABLES
查看当前数据库中的表,但操作前需先用USE
语句切换到目标数据库 。例如:
USE mysql;
SHOW TABLES;
(三)创建表
语法:
create table 表名(
字段名1 类型[(宽度) 约束条件],
字段名2 类型[(宽度) 约束条件],
字段名3 类型[(宽度) 约束条件]
);
注意同一张表中字段名不能相同,字段名和类型必填,宽度和约束条件可选,表中最后一个字段不加逗号。
-
数据类型 :MySQL 支持数值、日期 / 时间和字符串类型。比如字符串类型中的
CHAR
是定长字符串,VARCHAR
是变长字符串 。 -
约束条件 :用于保证数据完整性和一致性。如
PRIMARY KEY
(主键)唯一标识记录,NOT NULL
表示字段不能为空 。例如:create table t1(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(50) NOT NULL,
age int DEFAULT NULL
);
(四)修改表
修改表名 :ALTER TABLE 表名 RENAME 新表名;
,如ALTER TABLE t1 RENAME t2;
。
增加字段 :有多种添加方式,如ALTER TABLE 表名 ADD 字段名 数据类型[完整性约束条件];
。例如ALTER TABLE t1 ADD class int(3) not null;
。
删除字段 :ALTER TABLE 表名 DROP 字段名;
,如alter table t2 drop class;
。
修改字段 :可用MODIFY
或CHANGE
关键字。例如alter table t2 modify name char(50);
和alter table t2 change name user_name varchar(50);
。
(五)复制表
只复制表结构:create table 新表名 like 原表名;
,如create table t3 like t2;
。
复制表结构和记录(不复制主键、外键和索引):create table 新表名 select * from 原表名;
,如create table t4 select *from t2;
。
(六)删除表
删除表时,若指定 "数据库名。表名" 可直接删除;若只指定表名,需先切换到目标数据库。例如drop table t2;
。
四、MySQL 数据操作
(一)插入数据
使用INSERT INTO
语句,可插入单条或多条记录。例如:
INSERT INTO t1 VALUES (1, '张三', 18);
INSERT INTO t1 VALUES (2, '李四', 20), (3, '王五', 22);
(二)删除数据
DELETE FROM
语句用于删除指定数据,需加WHERE
条件,否则会删除所有记录。如delete from t1 where id = 1;
。
(三)更新数据
UPDATE
语句用于更新数据,同样需WHERE
条件。例如update t1 set age = 100 where name = "wangwu";
。
(四)查询数据
-
单表查询
- 语法与执行优先级 :语法为
SELECT 字段1, 字段2... FROM 表名 WHERE 条件 GROUP BY字段 HAVING 筛选 ORDER BY 字段 LIMIT 限制条数
,执行优先级为from > where > group by > having > select > order by > limit
。 - 准备数据:先创建测试库和表并插入数据。例如:
create database test;
use test;
create table renyuan(
id int not null unique auto_increment,
name varchar(20) not null,
sex enum('male', 'female') not null default'male',
age int(3) unsigned not null default 28,
hire_date date not null,
post varchar(50),
post_comment varchar(100),
salary double(15, 2),
office int,
depart_id int
);
insert into renyuan (name, sex, age, hire_date, post, salary, office, depart_id) values
('zhangsan','male', 18, '20170301', 'teacher', 7300.33, 401, 1),
('lisi','male', 78, '20150302', 'teacher', 1000000.31, 401, 1),
...; - 语法与执行优先级 :语法为
- 各种查询方式 :
- 简单查询 :
SELECT 字段1,字段2... FROM 表名
,用*
表示所有字段。如SELECT id, name, office FROM renyuan;
和SELECT * FROM renyuan;
。 - where 条件查询 :通过各种运算符筛选数据。例如薪资大于 10000 的人姓名:
select name, salary from renyuan where salary > 10000;
。 - group by 分组查询 :按指定字段分组,结合聚合函数使用。如取每个部门的最高工资:
select post, max(salary) from renyuan group by post;
。 - having 过滤查询 :在分组后过滤,可使用聚合函数。如查询平均工资大于 10000 的岗位:
select post, avg(salary) from renyuan group by post having avg(salary) > 10000;
。 - order by 排序查询 :用
ASC
(升序,默认)或DESC
(降序)排序。如select * from renyuan order by id asc;
和select * from renyuan order by id desc;
。 - limit 限制结果条目查询 :限制返回行数。如倒叙排列后仅显示第一行:
select * from renyuan order by id desc limit 1;
。 - 正则匹配查询 :用
REGEXP
关键字匹配特殊字符串。如查询Name
是1
开头的姓名:select * from renyuan where name regexp '^1';
。
- 简单查询 :
- 多表查询
- 子查询:在一个查询语句中嵌套另一个查询语句,结果作为外层条件。例如查询平均年龄在 25 岁以上的部门名。
- 连接查询 :
- 左连接 :以左表为基础表,显示左表所有行和右表符合条件的行。如
select renyuan.id, renyuan.name, bumen.name as depart_name from renyuan left join bumen on renyuan.dep_id = bumen.id;
。 - 右连接 :以右表为基础表,显示右表所有行和左表符合条件的行。如
select renyuan.id, renyuan.name, bumen.name as depart_name from renyuan right join bumen on renyuan.dep_id = bumen.id;
。
- 左连接 :以左表为基础表,显示左表所有行和右表符合条件的行。如
五、MySQL 用户授权
(一)创建用户
语法为CREATE USER 用户名@来源地址 IDENTIFIED BY '密码';
。例如CREATE USER 'xiaoqi'@'localhost' IDENTIFIED BY '123456';
创建了可从本机访问的xiaoqi
用户,密码为123456
。
(二)授权操作
语法是GRANT 权限列表 ON 数据库名.表名 TO 用户名@来源地址
。例如为xiaoqi
用户赋予对test
数据库所有表的查询权限:GRANT SELECT ON test.* TO 'xiaoqi'@'localhost';
。实际应用中,可根据需求创建不同权限的用户,保障数据库安全。
六、总结
本文全面介绍了 MySQL 数据库的库操作、表操作、数据操作和用户权限操作。掌握这些知识,你就能熟练进行 MySQL 数据库的日常维护与管理。后续可深入学习索引优化、存储引擎等进阶内容,提升数据库管理和开发能力。
七、索引:提升查询性能的关键
(一)索引的概念与作用
索引就像是书籍的目录,能帮助数据库快速定位数据。在 MySQL 中,合理使用索引可以极大地提高查询效率。例如,在一张包含大量用户信息的表中,如果经常需要根据用户 ID 进行查询,为用户 ID 字段添加索引后,查询速度会显著提升。
(二)索引的类型
- 主键索引 :每个表只能有一个主键索引,它保证了字段值的唯一性且不能为空,如
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));
,这里的id
字段就是主键索引。 - 唯一索引 :确保字段值的唯一性,但可以为空,使用
UNIQUE
关键字创建,例如CREATE UNIQUE INDEX idx_name ON users(name);
。 - 普通索引 :最常见的索引类型,用于加速查询,通过
CREATE INDEX
语句创建,如CREATE INDEX idx_age ON users(age);
。 - 全文索引 :主要用于文本类型字段的全文搜索,MySQL 5.6 及以上版本支持,例如
ALTER TABLE articles ADD FULLTEXT(content);
,可对articles
表的content
字段进行全文索引。
(三)创建与删除索引
- 创建索引 :除了上述在创建表时直接定义索引的方式,也可以在已有表上添加索引。例如,为已存在的
users
表的email
字段添加普通索引:CREATE INDEX idx_email ON users(email);
。 - 删除索引 :当索引不再需要时,可以使用
DROP INDEX
语句删除。如删除users
表的idx_email
索引:DROP INDEX idx_email ON users;
。
八、事务处理:确保数据的一致性与完整性
(一)事务的定义与特性
事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部失败回滚,以保证数据的一致性和完整性。事务具有 ACID 特性:
- 原子性(Atomicity):事务中的操作要么全部完成,要么全部不完成。
- 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏。
- 隔离性(Isolation):多个事务并发执行时,相互之间不会干扰。
- 持久性(Durability):一旦事务提交,其对数据库的修改会永久保存。
(二)事务的操作语句
-
开始事务 :使用
START TRANSACTION
或BEGIN
语句开始一个事务。例如:START TRANSACTION;
提交事务 :当事务中的所有操作都成功完成后,使用COMMIT
语句提交事务,将对数据库的修改永久保存。
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
COMMIT;
回滚事务 :如果在事务执行过程中出现错误,使用ROLLBACK
语句回滚事务,撤销所有未提交的修改。
START TRANSACTION;
UPDATE products SET stock = stock - 5 WHERE product_id = 1;
-- 假设出现错误,回滚事务
ROLLBACK;
(三)事务的隔离级别
MySQL 支持多种事务隔离级别,通过SET SESSION TRANSACTION ISOLATION LEVEL
语句设置。常见的隔离级别有:
读未提交(READ UNCOMMITTED):允许一个事务读取另一个未提交事务的数据,可能会出现脏读、不可重复读和幻读问题。
读已提交(READ COMMITTED):只能读取已提交事务的数据,可避免脏读,但仍可能出现不可重复读和幻读。
可重复读(REPEATABLE READ):在同一个事务中多次读取相同数据时,结果保持一致,可避免脏读和不可重复读,但可能出现幻读,这是 MySQL 的默认隔离级别。
串行化(SERIALIZABLE):最高的隔离级别,通过强制事务串行执行,避免了所有并发问题,但性能较低。
九、存储引擎:选择适合的数据库 "引擎"
(一)常见存储引擎介绍
MySQL 支持多种存储引擎,每种都有其特点和适用场景。
InnoDB:是 MySQL 5.5 及以上版本的默认存储引擎,支持事务处理、行级锁和外键约束,适合处理大量并发事务的场景,如电商订单系统。
MyISAM:不支持事务和行级锁,但查询速度快,适合读操作频繁的应用,如博客系统。
Memory:数据存储在内存中,读写速度极快,但数据易丢失,适合临时数据存储,如缓存数据。
(二)选择存储引擎的考量因素
- 事务需求:如果应用对事务一致性要求高,如金融系统,应选择 InnoDB;若无需事务支持,MyISAM 或 Memory 可能更合适。
- 并发性能:高并发场景下,InnoDB 的行级锁能更好地处理并发操作;而 MyISAM 的表级锁在并发写入时性能较差。
- 数据持久性:Memory 存储引擎数据存储在内存,适合临时数据;若数据需要持久保存,应选择 InnoDB 或 MyISAM。
(三)修改存储引擎
可以在创建表时指定存储引擎,如CREATE TABLE test (id INT) ENGINE=InnoDB;
。也可以对已存在的表修改存储引擎,使用ALTER TABLE
语句,例如:
ALTER TABLE test ENGINE=MyISAM;
十、数据库备份与恢复:保障数据安全
(一)备份的重要性
数据库备份是防止数据丢失的重要手段。无论是硬件故障、人为错误还是恶意攻击,备份数据都能帮助我们快速恢复数据,减少损失。
(二)常用备份工具与方法
-
mysqldump 命令 :这是 MySQL 自带的备份工具,可以将数据库中的数据和结构以 SQL 语句的形式导出到文件中。例如,备份
test
数据库:mysqldump -u root -p test > test_backup.sql
MySQL Enterprise Backup:适用于企业级应用,提供更高级的备份功能,如热备份、增量备份等。
第三方工具:如 Percona XtraBackup,开源且功能强大,支持 InnoDB 存储引擎的热备份。
(三)恢复备份数据
恢复备份数据时,根据备份方式的不同,操作也有所差异。对于mysqldump
备份的文件,可以使用mysql
命令导入数据:
mysql -u root -p test < test_backup.sql
如果使用其他备份工具,需按照相应的恢复流程进行操作。
十、性能优化:让 MySQL 跑得更快
(一)查询优化
-
分析查询语句 :使用
EXPLAIN
关键字分析查询语句的执行计划,查看索引使用情况、表连接顺序等,找出性能瓶颈。例如:EXPLAIN SELECT * FROM users WHERE age > 30;
优化索引使用:根据查询需求创建合适的索引,避免全表扫描。同时,定期维护索引,删除不再使用的索引,以提高查询性能。
优化查询语句结构 :尽量避免子查询,使用连接查询替代;合理使用LIMIT
限制返回数据量,减少数据传输和处理开销。
(二)服务器配置优化
调整内存分配 :根据服务器硬件资源和业务负载,合理调整 MySQL 的内存参数,如innodb_buffer_pool_size
(InnoDB 存储引擎的缓冲池大小),提高数据缓存命中率。
优化磁盘 I/O:使用高速磁盘存储数据,定期清理磁盘空间,减少磁盘碎片,提高磁盘 I/O 性能。
并发连接数设置 :根据服务器性能和并发访问量,合理设置max_connections
参数,避免过多连接导致服务器性能下降。
(三)数据库架构优化
数据库设计优化:遵循数据库设计范式,减少数据冗余,提高数据的一致性和完整性。同时,根据业务需求进行适当的反范式化设计,提高查询性能。
分库分表:当数据量过大时,采用分库分表技术将数据分散存储,降低单个数据库和表的负载,提高系统的扩展性和性能。
十二、总结
通过深入学习索引、事务处理、存储引擎、数据库备份恢复和性能优化等知识,我们对 MySQL 数据库的理解和运用能力得到了进一步提升。在实际工作中,根据具体业务需求选择合适的技术和策略,能够充分发挥 MySQL 的优势,构建高效、稳定的数据库系统。希望这些内容能帮助你在 MySQL 的学习和实践中更上一层楼