一、引言
MySQL 作为一款广泛使用的开源关系型数据库管理系统,在软件开发领域占据着重要地位。无论是小型项目还是大型企业级应用,都能看到 MySQL 的身影。今天就来和大家分享 MySQL 的相关知识,帮助大家更好地应对日常开发和面试。
二、MySQL 基础概念
(一)数据库与表
- 数据库:数据库就像是一个大仓库,用于存储和管理数据。可以在一个 MySQL 服务器上创建多个数据库,每个数据库相互独立。例如,一个电商项目可能有一个专门存储商品信息的数据库。
- 表:表是数据库中实际存储数据的结构,由行和列组成,类似于 Excel 表格。每一行代表一条记录,每一列代表一个字段。比如商品表中,每一行记录一个商品的信息,列可能包括商品 ID、商品名称、价格等。
(二)数据类型
MySQL 支持多种数据类型,常见的有:
- 数值类型:如INT(整数)、DOUBLE(双精度浮点数),用于存储数字。例如,商品价格可以用DOUBLE类型存储。
- 字符串类型:VARCHAR(可变长度字符串)、CHAR(固定长度字符串)。商品名称可以用VARCHAR类型存储,因为不同商品名称长度不同。
- 日期和时间类型:DATE(日期)、DATETIME(日期和时间)。记录商品上架时间可以用DATETIME类型。
三、常用 SQL 操作
(一)数据定义语言(DDL)
- 创建数据库:
CREATE DATABASE mydatabase;
- 创建表:
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(255),
price DOUBLE,
create_time DATETIME
);
- 修改表结构:添加字段
ALTER TABLE products ADD COLUMN description VARCHAR(500);
- 删除表:
DROP TABLE products;
(二)数据操作语言(DML)
- 插入数据:
INSERT INTO products (product_name, price, create_time) VALUES ('iPhone 15', 7999.0, NOW());
- 更新数据:
UPDATE products SET price = 8499.0 WHERE product_id = 1;
- 删除数据:
DELETE FROM products WHERE product_id = 1;
(三)数据查询语言(DQL)
- 简单查询:
SELECT * FROM products;
- 条件查询:查询价格大于 8000 的商品
SELECT * FROM products WHERE price > 8000;
- 排序查询:按价格升序排序
SELECT * FROM products ORDER BY price ASC;
- 聚合查询:统计商品数量
SELECT COUNT(*) FROM products;
四、索引
(一)索引的作用
索引就像一本书的目录,能加快数据的查询速度。在数据库中,当执行查询语句时,如果没有索引,数据库需要全表扫描来查找数据;有了索引,数据库可以快速定位到符合条件的数据行。
(二)索引类型
- 主键索引:每个表只能有一个主键索引,用于唯一标识表中的每一行记录,如product_id。
- 唯一索引:保证索引列的值唯一,但可以为 NULL,例如商品的唯一编号。
- 普通索引:最基本的索引类型,没有唯一性限制,用于提高查询速度。
(三)创建索引
-- 创建普通索引
CREATE INDEX idx_product_name ON products (product_name);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_product_code ON products (product_code);
五、存储引擎
MySQL 支持多种存储引擎,常见的有:
- InnoDB:支持事务、行级锁、外键约束,是 MySQL 5.5 之后的默认存储引擎,适合处理大量并发事务的场景,如电商订单系统。
- MyISAM:不支持事务和行级锁,适合读多写少的场景,如数据仓库。
六、MySQL事务四大特性ACID
- 原子性:原子性意味着一个事务中的所有操作要么全部成功,要么全部失败。
- 一致性:一致性确保数据库在事务执行前后保持一致状态。
- 隔离性:隔离性保证并发执行的事务不会互相干扰。
- 持久性:持久性确保一旦事务被提交,其修改就会被永久保存。就像你在白纸上写字,只要不擦掉,字迹就会一直在那里。
七、四种事务隔离级别
- 读未提交:是最低的级别,只允许读取未提交的数据,可能导致脏读、幻读或不可重复读。
- 读已提交:较低级别,只允许读取已提交的数据,可以避免脏读,但仍可能出现幻读或不可重复读
- 可重复读:较高级别,确保在一个事务内多次读取同一数据时结果一致,避免了不可重复读,但仍可能出现幻读。
- 串行化:最高级别,完全避免脏读、不可重复读和幻读,但执行效率最低。
八、MySQL中的锁
- 表级锁(Table-level lock):锁定整个表,防止其他事务对表进行写操作。
- 行级锁(Record Locks):只锁定需要操作的行,允许其他事务访问未被锁定的行。 锁的是完整的数据 是索引树
- 页级锁:锁定数据页,介于表级锁和行级锁之间。
- 乐观锁(Optimistic Lock):假设冲突不会发生,只在提交时检查是否有冲突。
- 悲观锁(Pessimistic Lock):假设冲突总会发生,因此在操作开始时就上锁。