一、MySQL 核心概念与架构
1.1 MySQL 体系结构- 客户端层
- ↓
- 连接层(连接池、线程池)
- ↓
- SQL层(解析器、优化器、缓存)
- ↓
- 存储引擎层(InnoDB、MyISAM、Memory)
- ↓
- 物理存储层
复制代码1.2 存储引擎对比
| 特性 | InnoDB | MyISAM | Memory | Archive |
|---|
| 事务支持 | ✓ | × | × | × | | 行级锁 | ✓ | × | × | × | | 外键约束 | ✓ | × | × | × | | 全文索引 | ✓ (5.6+) | ✓ | × | × | | 数据压缩 | ✓ | ✓ | × | ✓ | | 缓存 | 数据+索引 | 仅索引 | 内存 | 无 | | 适用场景 | 事务处理 | 读密集型 | 临时表 | 归档 |
二、数据库基本操作
2.1 数据库管理- -- 查看所有数据库
- SHOW DATABASES;
- -- 查看数据库创建语句
- SHOW CREATE DATABASE database_name;
- -- 创建数据库(指定字符集)
- CREATE DATABASE mydb
- CHARACTER SET utf8mb4
- COLLATE utf8mb4_unicode_ci;
- -- 选择数据库
- USE mydb;
- -- 修改数据库字符集
- ALTER DATABASE mydb
- CHARACTER SET utf8mb4
- COLLATE utf8mb4_unicode_ci;
- -- 删除数据库
- DROP DATABASE mydb;
复制代码2.2 表管理- -- 创建表(完整示例)
- CREATE TABLE employees (
- id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
- emp_no VARCHAR(20) NOT NULL UNIQUE,
- name VARCHAR(100) NOT NULL,
- gender ENUM('M', 'F') DEFAULT 'M',
- birth_date DATE NOT NULL,
- hire_date DATE NOT NULL,
- salary DECIMAL(10,2) DEFAULT 0.00,
- department_id INT UNSIGNED,
- email VARCHAR(100) UNIQUE,
- phone VARCHAR(20),
- address TEXT,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- ON UPDATE CURRENT_TIMESTAMP,
-
- -- 索引
- INDEX idx_department (department_id),
- INDEX idx_name (name),
- INDEX idx_hire_date (hire_date),
-
- -- 外键约束
- CONSTRAINT fk_department
- FOREIGN KEY (department_id)
- REFERENCES departments(id)
- ON DELETE SET NULL ON UPDATE CASCADE,
-
- -- 检查约束(MySQL 8.0.16+)
- CONSTRAINT chk_salary CHECK (salary >= 0)
- ) ENGINE=InnoDB
- DEFAULT CHARSET=utf8mb4
- COLLATE=utf8mb4_unicode_ci
- COMMENT='员工信息表';
- -- 查看表结构
- DESC employees;
- DESCRIBE employees;
- SHOW COLUMNS FROM employees;
- -- 查看建表语句
- SHOW CREATE TABLE employees;
- -- 修改表结构
- -- 添加列
- ALTER TABLE employees
- ADD COLUMN nickname VARCHAR(50) AFTER name;
- -- 修改列
- ALTER TABLE employees
- MODIFY COLUMN phone VARCHAR(30) NOT NULL;
- -- 重命名列
- ALTER TABLE employees
- CHANGE COLUMN phone mobile_phone VARCHAR(30);
- -- 删除列
- ALTER TABLE employees
- DROP COLUMN nickname;
- -- 添加索引
- ALTER TABLE employees
- ADD INDEX idx_email (email(50));
- -- 添加唯一索引
- ALTER TABLE employees
- ADD UNIQUE INDEX uk_emp_no (emp_no);
- -- 删除索引
- ALTER TABLE employees
- DROP INDEX idx_email;
- -- 重命名表
- RENAME TABLE employees TO staff;
- ALTER TABLE staff RENAME TO employees;
- -- 清空表(更快)
- TRUNCATE TABLE employees;
- -- 删除表
- DROP TABLE employees;
复制代码三、数据操作(CRUD)
3.1 插入数据- -- 插入单条数据
- INSERT INTO employees (emp_no, name, gender, birth_date, hire_date, salary)
- VALUES ('EMP001', '张三', 'M', '1990-05-15', '2020-03-01', 15000.00);
- -- 插入多条数据
- INSERT INTO employees (emp_no, name, gender, birth_date, hire_date, salary) VALUES
- ('EMP002', '李四', 'F', '1992-08-20', '2019-07-15', 18000.00),
- ('EMP003', '王五', 'M', '1988-12-10', '2018-11-01', 22000.00),
- ('EMP004', '赵六', 'F', '1995-03-25', '2021-02-14', 12000.00);
- -- 插入查询结果
- INSERT INTO employee_archive (emp_no, name, hire_date, salary)
- SELECT emp_no, name, hire_date, salary
- FROM employees
- WHERE hire_date < '2020-01-01';
- -- 替换数据(存在则替换)
- REPLACE INTO employees (id, emp_no, name)
- VALUES (1, 'EMP001', '张三新名字');
- -- 插入时忽略错误
- INSERT IGNORE INTO employees (emp_no, name)
- VALUES ('EMP001', '张三');
- -- 从文件导入数据
- LOAD DATA INFILE '/path/to/data.csv'
- INTO TABLE employees
- FIELDS TERMINATED BY ','
- ENCLOSED BY '"'
- LINES TERMINATED BY '\n'
- IGNORE 1 ROWS
- (emp_no, name, gender, birth_date, hire_date, salary);
复制代码3.2 查询数据- -- 基本查询
- SELECT * FROM employees;
- SELECT id, name, salary FROM employees;
- SELECT DISTINCT department_id FROM employees;
- -- 条件查询
- SELECT * FROM employees WHERE salary > 15000;
- SELECT * FROM employees WHERE hire_date BETWEEN '2020-01-01' AND '2021-12-31';
- SELECT * FROM employees WHERE name LIKE '张%'; -- 张开头
- SELECT * FROM employees WHERE name LIKE '%三%'; -- 包含三
- SELECT * FROM employees WHERE name LIKE '%三'; -- 三结尾
- SELECT * FROM employees WHERE email IS NOT NULL;
- SELECT * FROM employees WHERE department_id IN (1, 2, 3);
- SELECT * FROM employees WHERE (salary > 10000 AND gender = 'M') OR department_id = 1;
- -- 排序
- SELECT * FROM employees ORDER BY salary DESC;
- SELECT * FROM employees ORDER BY hire_date ASC, salary DESC;
- -- 限制结果
- SELECT * FROM employees LIMIT 10; -- 前10条
- SELECT * FROM employees LIMIT 5, 10; -- 从第6条开始,取10条
- SELECT * FROM employees LIMIT 10 OFFSET 5; -- 同上
- -- 分组统计
- SELECT
- department_id,
- COUNT(*) AS emp_count,
- AVG(salary) AS avg_salary,
- MAX(salary) AS max_salary,
- MIN(salary) AS min_salary,
- SUM(salary) AS total_salary
- FROM employees
- WHERE hire_date >= '2020-01-01'
- GROUP BY department_id
- HAVING COUNT(*) > 5
- ORDER BY avg_salary DESC;
- -- 连接查询
- -- 内连接
- SELECT
- e.name AS employee_name,
- d.name AS department_name,
- e.salary
- FROM employees e
- INNER JOIN departments d ON e.department_id = d.id
- WHERE d.name = '技术部';
- -- 左连接
- SELECT
- e.name AS employee_name,
- d.name AS department_name
- FROM employees e
- LEFT JOIN departments d ON e.department_id = d.id;
- -- 右连接
- SELECT
- e.name AS employee_name,
- d.name AS department_name
- FROM employees e
- RIGHT JOIN departments d ON e.department_id = d.id;
- -- 自连接
- SELECT
- e1.name AS employee,
- e2.name AS manager
- FROM employees e1
- LEFT JOIN employees e2 ON e1.manager_id = e2.id;
- -- 子查询
- -- WHERE 子查询
- SELECT * FROM employees
- WHERE salary > (SELECT AVG(salary) FROM employees);
- -- FROM 子查询
- SELECT dept_id, avg_sal FROM (
- SELECT department_id AS dept_id, AVG(salary) AS avg_sal
- FROM employees
- GROUP BY department_id
- ) AS temp
- WHERE avg_sal > 15000;
- -- SELECT 子查询
- SELECT
- e.name,
- e.salary,
- (SELECT AVG(salary) FROM employees) AS company_avg_salary
- FROM employees e;
- -- EXISTS 子查询
- SELECT * FROM departments d
- WHERE EXISTS (
- SELECT 1 FROM employees e
- WHERE e.department_id = d.id AND e.salary > 20000
- );
- -- 联合查询
- SELECT name, salary, '员工' AS type FROM employees
- UNION
- SELECT dept_name, budget, '部门' AS type FROM departments
- ORDER BY salary DESC;
复制代码3.3 更新数据- -- 更新单条
- UPDATE employees
- SET salary = salary * 1.1,
- updated_at = NOW()
- WHERE id = 1;
- -- 批量更新
- UPDATE employees
- SET salary = salary * 1.05
- WHERE department_id = 1
- AND hire_date < '2020-01-01';
- -- 多表更新
- UPDATE employees e
- JOIN departments d ON e.department_id = d.id
- SET e.salary = e.salary * 1.1
- WHERE d.name = '技术部';
- -- 使用子查询更新
- UPDATE employees
- SET salary = salary + 1000
- WHERE id IN (
- SELECT id FROM (
- SELECT id FROM employees
- WHERE performance_score > 90
- ) AS tmp
- );
复制代码3.4 删除数据- -- 删除指定数据
- DELETE FROM employees WHERE id = 1;
- -- 批量删除
- DELETE FROM employees WHERE hire_date < '2010-01-01';
- -- 多表删除
- DELETE e, d
- FROM employees e
- JOIN departments d ON e.department_id = d.id
- WHERE d.status = 'inactive';
- -- 使用子查询删除
- DELETE FROM employees
- WHERE department_id IN (
- SELECT id FROM departments WHERE status = 'closed'
- );
- -- 清空表(不可恢复)
- TRUNCATE TABLE employees;
复制代码四、索引管理
4.1 索引类型- -- 主键索引
- CREATE TABLE users (
- id INT PRIMARY KEY AUTO_INCREMENT,
- name VARCHAR(50)
- );
- -- 唯一索引
- CREATE UNIQUE INDEX uk_email ON users(email);
- -- 普通索引
- CREATE INDEX idx_name ON users(name);
- CREATE INDEX idx_name_dob ON users(name, birth_date);
- -- 全文索引
- CREATE FULLTEXT INDEX ft_content ON articles(content);
- -- 空间索引
- CREATE SPATIAL INDEX sp_location ON locations(coordinates);
- -- 前缀索引
- CREATE INDEX idx_name_prefix ON users(name(20));
- -- 组合索引
- CREATE INDEX idx_composite ON orders(user_id, order_date, status);
复制代码4.2 索引管理命令- -- 查看索引
- SHOW INDEX FROM users;
- SHOW INDEXES FROM users;
- SHOW KEYS FROM users;
- -- 分析索引使用
- ANALYZE TABLE users;
- EXPLAIN SELECT * FROM users WHERE name = '张三';
- -- 优化表(重建索引)
- OPTIMIZE TABLE users;
- -- 强制使用索引
- SELECT * FROM users
- FORCE INDEX (idx_name)
- WHERE name LIKE '张%';
- -- 忽略索引
- SELECT * FROM users
- IGNORE INDEX (idx_name)
- WHERE name = '张三';
- -- 重建索引
- ALTER TABLE users DROP INDEX idx_name;
- ALTER TABLE users ADD INDEX idx_name (name);
复制代码五、事务管理
5.1 事务基本操作- -- 开启事务
- START TRANSACTION;
- -- 或
- BEGIN;
- -- 或
- BEGIN WORK;
- -- 提交事务
- COMMIT;
- -- 回滚事务
- ROLLBACK;
- -- 保存点
- START TRANSACTION;
- INSERT INTO table1 VALUES (1, 'test');
- SAVEPOINT sp1;
- INSERT INTO table2 VALUES (1, 'test');
- ROLLBACK TO SAVEPOINT sp1; -- 回滚到保存点
- COMMIT;
- -- 设置事务隔离级别
- SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
- START TRANSACTION;
- -- 事务操作
- COMMIT;
复制代码5.2 事务隔离级别- -- 查看隔离级别
- SELECT @@transaction_isolation;
- SELECT @@global.transaction_isolation;
- SELECT @@session.transaction_isolation;
- -- 设置隔离级别
- -- 1. READ UNCOMMITTED(读未提交)
- -- 2. READ COMMITTED(读已提交)
- -- 3. REPEATABLE READ(可重复读)- MySQL默认
- -- 4. SERIALIZABLE(串行化)
- -- 会话级别
- SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
- -- 全局级别
- SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
- -- 在my.cnf中设置
- [mysqld]
- transaction-isolation = READ-COMMITTED
复制代码六、存储过程与函数
6.1 存储过程- -- 创建存储过程
- DELIMITER $$
- CREATE PROCEDURE GetEmployeeCountByDept(
- IN dept_id INT,
- OUT emp_count INT
- )
- BEGIN
- DECLARE v_count INT DEFAULT 0;
-
- -- 业务逻辑
- SELECT COUNT(*) INTO v_count
- FROM employees
- WHERE department_id = dept_id;
-
- -- 输出参数
- SET emp_count = v_count;
-
- -- 返回结果集
- SELECT * FROM employees
- WHERE department_id = dept_id;
- END$$
- DELIMITER ;
- -- 调用存储过程
- CALL GetEmployeeCountByDept(1, @count);
- SELECT @count;
- -- 删除存储过程
- DROP PROCEDURE IF EXISTS GetEmployeeCountByDept;
- -- 查看存储过程
- SHOW PROCEDURE STATUS;
- SHOW CREATE PROCEDURE GetEmployeeCountByDept;
复制代码6.2 函数- -- 创建函数
- DELIMITER $$
- CREATE FUNCTION CalculateBonus(
- salary DECIMAL(10,2),
- performance_rate DECIMAL(5,2)
- ) RETURNS DECIMAL(10,2)
- DETERMINISTIC
- READS SQL DATA
- BEGIN
- DECLARE bonus DECIMAL(10,2);
-
- IF performance_rate >= 1.2 THEN
- SET bonus = salary * 0.3;
- ELSEIF performance_rate >= 1.0 THEN
- SET bonus = salary * 0.2;
- ELSE
- SET bonus = salary * 0.1;
- END IF;
-
- RETURN ROUND(bonus, 2);
- END$$
- DELIMITER ;
- -- 使用函数
- SELECT
- name,
- salary,
- CalculateBonus(salary, 1.5) AS bonus
- FROM employees;
- -- 查看函数
- SHOW FUNCTION STATUS;
- SHOW CREATE FUNCTION CalculateBonus;
复制代码七、触发器- -- 创建触发器
- DELIMITER $$
- CREATE TRIGGER before_employee_update
- BEFORE UPDATE ON employees
- FOR EACH ROW
- BEGIN
- -- 记录修改历史
- INSERT INTO employee_history (
- employee_id,
- old_salary,
- new_salary,
- change_time
- ) VALUES (
- OLD.id,
- OLD.salary,
- NEW.salary,
- NOW()
- );
-
- -- 自动更新修改时间
- SET NEW.updated_at = NOW();
- END$$
- DELIMITER ;
- -- 创建审计触发器
- CREATE TRIGGER audit_employee_changes
- AFTER INSERT OR UPDATE OR DELETE ON employees
- FOR EACH ROW
- BEGIN
- DECLARE action_type VARCHAR(10);
-
- IF INSERTING THEN
- SET action_type = 'INSERT';
- INSERT INTO audit_log (
- table_name,
- record_id,
- action,
- old_data,
- new_data,
- changed_by,
- change_time
- ) VALUES (
- 'employees',
- NEW.id,
- action_type,
- NULL,
- JSON_OBJECT(
- 'name', NEW.name,
- 'salary', NEW.salary
- ),
- USER(),
- NOW()
- );
- ELSEIF UPDATING THEN
- SET action_type = 'UPDATE';
- INSERT INTO audit_log (
- table_name,
- record_id,
- action,
- old_data,
- new_data,
- changed_by,
- change_time
- ) VALUES (
- 'employees',
- OLD.id,
- action_type,
- JSON_OBJECT(
- 'name', OLD.name,
- 'salary', OLD.salary
- ),
- JSON_OBJECT(
- 'name', NEW.name,
- 'salary', NEW.salary
- ),
- USER(),
- NOW()
- );
- ELSEIF DELETING THEN
- SET action_type = 'DELETE';
- INSERT INTO audit_log (
- table_name,
- record_id,
- action,
- old_data,
- new_data,
- changed_by,
- change_time
- ) VALUES (
- 'employees',
- OLD.id,
- action_type,
- JSON_OBJECT(
- 'name', OLD.name,
- 'salary', OLD.salary
- ),
- NULL,
- USER(),
- NOW()
- );
- END IF;
- END$$
- DELIMITER ;
- -- 查看触发器
- SHOW TRIGGERS;
- SHOW CREATE TRIGGER before_employee_update;
- -- 删除触发器
- DROP TRIGGER IF EXISTS before_employee_update;
复制代码八、用户与权限管理
8.1 用户管理- -- 创建用户
- CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
- CREATE USER 'username'@'%' IDENTIFIED BY 'password'; -- 允许远程
- CREATE USER 'username'@'192.168.1.%' IDENTIFIED BY 'password'; -- 指定IP段
- -- 修改用户名
- RENAME USER 'old_user'@'localhost' TO 'new_user'@'localhost';
- -- 修改密码
- ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';
- -- MySQL 8.0+
- ALTER USER 'username'@'localhost'
- IDENTIFIED WITH mysql_native_password BY 'password';
- -- 删除用户
- DROP USER 'username'@'localhost';
- -- 查看用户
- SELECT user, host FROM mysql.user;
- SELECT * FROM mysql.user WHERE user = 'username';
- -- 查看当前用户
- SELECT CURRENT_USER();
- SELECT USER();
复制代码8.2 权限管理- -- 授予权限
- -- 语法:GRANT 权限 ON 数据库.表 TO 用户@主机
- -- 授予所有权限
- GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';
- -- 授予数据库所有权限
- GRANT ALL PRIVILEGES ON mydb.* TO 'user'@'localhost';
- -- 授予特定表权限
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.employees TO 'user'@'localhost';
- -- 授予列级权限
- GRANT SELECT (id, name), UPDATE (name) ON mydb.employees TO 'user'@'localhost';
- -- 授予存储过程权限
- GRANT EXECUTE ON PROCEDURE mydb.GetEmployeeCount TO 'user'@'localhost';
- -- 创建角色
- CREATE ROLE 'read_only', 'read_write', 'admin';
- -- 为角色授权
- GRANT SELECT ON mydb.* TO 'read_only';
- GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'read_write';
- GRANT ALL PRIVILEGES ON *.* TO 'admin';
- -- 将角色授予用户
- GRANT 'read_only' TO 'user'@'localhost';
- SET DEFAULT ROLE 'read_only' TO 'user'@'localhost';
- -- 查看权限
- SHOW GRANTS FOR 'user'@'localhost';
- SELECT * FROM mysql.user WHERE user = 'username';
- SELECT * FROM mysql.db WHERE user = 'username';
- -- 查看当前用户权限
- SHOW GRANTS;
- -- 撤销权限
- REVOKE INSERT ON mydb.* FROM 'user'@'localhost';
- -- 刷新权限
- FLUSH PRIVILEGES;
复制代码九、备份与恢复
9.1 备份方法- # 1. mysqldump 逻辑备份
- # 备份整个数据库
- mysqldump -u root -p --all-databases > backup.sql
- # 备份指定数据库
- mysqldump -u root -p mydb > mydb_backup.sql
- # 备份指定表
- mysqldump -u root -p mydb employees departments > tables_backup.sql
- # 备份结构
- mysqldump -u root -p --no-data mydb > mydb_structure.sql
- # 备份数据
- mysqldump -u root -p --no-create-info mydb > mydb_data.sql
- # 压缩备份
- mysqldump -u root -p mydb | gzip > mydb_backup.sql.gz
- # 2. 二进制日志备份
- # 查看当前二进制日志
- SHOW BINARY LOGS;
- SHOW MASTER STATUS;
- # 备份二进制日志
- mysqlbinlog mysql-bin.000001 > binlog_backup.sql
- # 3. 物理备份(InnoDB)
- # 使用Percona XtraBackup
- innobackupex --user=root --password=xxx /backup/
复制代码9.2 恢复方法- # 恢复整个数据库
- mysql -u root -p < backup.sql
- # 恢复指定数据库
- mysql -u root -p mydb < mydb_backup.sql
- # 恢复压缩备份
- gunzip < mydb_backup.sql.gz | mysql -u root -p mydb
- # 恢复二进制日志
- mysqlbinlog mysql-bin.000001 | mysql -u root -p
- # 从特定位置恢复
- mysqlbinlog --start-position=107 mysql-bin.000001 | mysql -u root -p
复制代码十、性能优化
10.1 查询优化- -- 使用EXPLAIN分析查询
- EXPLAIN SELECT * FROM employees WHERE name = '张三';
- -- 更详细的执行计划
- EXPLAIN FORMAT=JSON
- SELECT * FROM employees WHERE name = '张三';
- -- 分析查询性能
- EXPLAIN ANALYZE
- SELECT * FROM employees WHERE name = '张三';
- -- 优化建议
- -- 1. 避免SELECT *
- SELECT id, name, salary FROM employees;
- -- 2. 使用索引覆盖
- CREATE INDEX idx_covering ON employees(department_id, salary, name);
- SELECT department_id, salary, name FROM employees
- WHERE department_id = 1;
- -- 3. 避免在WHERE子句中使用函数
- -- 不推荐
- SELECT * FROM employees WHERE YEAR(hire_date) = 2023;
- -- 推荐
- SELECT * FROM employees
- WHERE hire_date >= '2023-01-01' AND hire_date < '2024-01-01';
- -- 4. 使用LIMIT
- SELECT * FROM employees ORDER BY id LIMIT 1000;
- -- 5. 批量操作
- INSERT INTO employees (name, salary) VALUES
- ('张三', 10000),
- ('李四', 12000),
- ('王五', 15000);
复制代码10.2 索引优化- -- 查看索引使用情况
- SELECT
- table_name,
- index_name,
- stat_value * @@innodb_page_size / 1024 / 1024 AS index_size_mb
- FROM mysql.innodb_index_stats
- WHERE database_name = 'mydb';
- -- 查找未使用的索引
- SELECT
- object_schema,
- object_name,
- index_name
- FROM performance_schema.table_io_waits_summary_by_index_usage
- WHERE index_name IS NOT NULL
- AND count_star = 0
- AND object_schema NOT IN ('mysql', 'sys', 'performance_schema');
- -- 删除冗余索引
- -- 查找(a,b)和(a)的索引,删除(a)
- SELECT
- a.TABLE_SCHEMA,
- a.TABLE_NAME,
- a.INDEX_NAME AS redundant_index,
- b.INDEX_NAME AS dominant_index
- FROM information_schema.STATISTICS a
- JOIN information_schema.STATISTICS b
- WHERE a.TABLE_SCHEMA = b.TABLE_SCHEMA
- AND a.TABLE_NAME = b.TABLE_NAME
- AND a.SEQ_IN_INDEX = b.SEQ_IN_INDEX
- AND a.COLUMN_NAME = b.COLUMN_NAME
- AND a.INDEX_NAME != b.INDEX_NAME
- AND a.NON_UNIQUE = 1
- AND b.NON_UNIQUE = 1
- AND a.INDEX_NAME LIKE 'idx%';
复制代码十一、监控与诊断
11.1 状态查看- -- 查看服务器状态
- SHOW STATUS;
- SHOW GLOBAL STATUS;
- SHOW SESSION STATUS;
- -- 查看变量
- SHOW VARIABLES;
- SHOW GLOBAL VARIABLES LIKE '%buffer%';
- -- 查看进程列表
- SHOW PROCESSLIST;
- SHOW FULL PROCESSLIST;
- -- 查看锁信息
- SHOW ENGINE INNODB STATUS;
- SELECT * FROM information_schema.INNODB_LOCKS;
- SELECT * FROM information_schema.INNODB_LOCK_WAITS;
- -- 查看表状态
- SHOW TABLE STATUS LIKE 'employees';
- ANALYZE TABLE employees; -- 更新统计信息
复制代码11.2 性能监控- -- 慢查询日志
- -- 在my.cnf中配置
- slow_query_log = 1
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 2
- log_queries_not_using_indexes = 1
- -- 查看慢查询
- SHOW VARIABLES LIKE 'slow_query_log%';
- SHOW VARIABLES LIKE 'long_query_time';
- -- 使用performance_schema
- SELECT * FROM performance_schema.events_statements_summary_by_digest
- ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
- -- 查看等待事件
- SELECT
- event_name,
- count_star,
- sum_timer_wait/1000000000 as total_wait_sec,
- avg_timer_wait/1000000000 as avg_wait_sec
- FROM performance_schema.events_waits_summary_global_by_event_name
- WHERE count_star > 0
- ORDER BY sum_timer_wait DESC LIMIT 10;
复制代码十二、高级功能
12.1 窗口函数- -- 排名函数
- SELECT
- name,
- salary,
- department_id,
- ROW_NUMBER() OVER (PARTITION BY department_id ORDER BY salary DESC) AS row_num,
- RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS rank_num,
- DENSE_RANK() OVER (PARTITION BY department_id ORDER BY salary DESC) AS dense_rank_num
- FROM employees;
- -- 聚合窗口函数
- SELECT
- name,
- salary,
- department_id,
- AVG(salary) OVER (PARTITION BY department_id) AS dept_avg_salary,
- SUM(salary) OVER (PARTITION BY department_id ORDER BY hire_date) AS running_total,
- FIRST_VALUE(salary) OVER (PARTITION BY department_id ORDER BY salary DESC) AS dept_max_salary
- FROM employees;
- -- 移动平均
- SELECT
- order_date,
- amount,
- AVG(amount) OVER (ORDER BY order_date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
- FROM orders;
复制代码12.2 JSON操作- -- 创建JSON字段
- CREATE TABLE products (
- id INT PRIMARY KEY,
- name VARCHAR(100),
- attributes JSON,
- metadata JSON
- );
- -- 插入JSON数据
- INSERT INTO products VALUES (
- 1,
- '手机',
- '{"brand": "Apple", "color": "black", "storage": 128}',
- '{"tags": ["new", "hot"], "rating": 4.5}'
- );
- -- 查询JSON
- SELECT
- name,
- attributes->'$.brand' AS brand,
- JSON_EXTRACT(attributes, '$.color') AS color,
- metadata->'$.rating' AS rating
- FROM products;
- -- JSON路径查询
- SELECT *
- FROM products
- WHERE JSON_EXTRACT(attributes, '$.brand') = 'Apple';
- -- 更新JSON
- UPDATE products
- SET attributes = JSON_SET(attributes, '$.price', 6999)
- WHERE id = 1;
- -- JSON函数
- SELECT
- JSON_TYPE(attributes) AS type,
- JSON_LENGTH(attributes) AS length,
- JSON_KEYS(attributes) AS keys,
- JSON_VALID(attributes) AS is_valid
- FROM products;
复制代码十三、维护命令
13.1 数据库维护- -- 优化表
- OPTIMIZE TABLE employees;
- OPTIMIZE LOCAL TABLE employees; -- 在线优化
- -- 修复表
- REPAIR TABLE employees;
- REPAIR TABLE employees QUICK;
- -- 检查表
- CHECK TABLE employees;
- CHECK TABLE employees FAST;
- CHECK TABLE employees CHANGED;
- -- 分析表
- ANALYZE TABLE employees;
- ANALYZE LOCAL TABLE employees;
- -- 更新统计信息
- ANALYZE TABLE employees UPDATE HISTOGRAM ON salary WITH 100 BUCKETS;
- -- 重建表
- ALTER TABLE employees ENGINE=InnoDB;
复制代码13.2 系统维护- # 导出数据
- mysqldump -u root -p mydb employees > employees.sql
- # 导入数据
- mysql -u root -p mydb < employees.sql
- # 批量执行SQL
- mysql -u root -p -e "SHOW DATABASES; SHOW TABLES;"
- # 定时备份脚本
- #!/bin/bash
- BACKUP_DIR="/backup/mysql"
- DATE=$(date +%Y%m%d_%H%M%S)
- mysqldump -u root -p'password' --all-databases | gzip > $BACKUP_DIR/backup_$DATE.sql.gz
- # 保留最近7天备份
- find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
复制代码十四、安全最佳实践
14.1 安全设置- -- 删除匿名用户
- DELETE FROM mysql.user WHERE User = '';
- FLUSH PRIVILEGES;
- -- 限制root远程登录
- DELETE FROM mysql.user WHERE User = 'root' AND Host NOT IN ('localhost', '127.0.0.1');
- FLUSH PRIVILEGES;
- -- 创建应用程序专用用户
- CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';
- GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'192.168.1.%';
- -- 定期更改密码
- ALTER USER 'app_user'@'192.168.1.%' PASSWORD EXPIRE INTERVAL 90 DAY;
- -- 查看用户权限
- SHOW GRANTS FOR 'app_user'@'192.168.1.%';
- -- 设置密码策略
- SET GLOBAL validate_password.policy = 2; -- STRONG
- SET GLOBAL validate_password.length = 12;
- SET GLOBAL validate_password.number_count = 2;
- SET GLOBAL validate_password.special_char_count = 1;
复制代码十五、故障排查
15.1 常见问题解决- -- 1. 连接数过多
- SHOW PROCESSLIST;
- SHOW STATUS LIKE 'Threads_connected';
- SHOW VARIABLES LIKE 'max_connections';
- -- 临时增加连接数
- SET GLOBAL max_connections = 1000;
- -- 2. 死锁检查
- SHOW ENGINE INNODB STATUS;
- SELECT * FROM information_schema.INNODB_LOCKS;
- SELECT * FROM information_schema.INNODB_LOCK_WAITS;
- -- 3. 慢查询分析
- SHOW VARIABLES LIKE 'slow_query_log%';
- SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
- -- 4. 表损坏修复
- CHECK TABLE employees;
- REPAIR TABLE employees;
- -- 5. 重置root密码
- # 停止MySQL服务
- # 启动跳过授权
- mysqld_safe --skip-grant-tables &
- # 修改密码
- ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword';
- # 重启服务
复制代码十六、实用脚本示例
16.1 监控脚本- -- 数据库健康检查
- SELECT
- VARIABLE_NAME,
- VARIABLE_VALUE,
- CASE
- WHEN VARIABLE_NAME IN ('uptime', 'threads_connected')
- THEN VARIABLE_VALUE
- WHEN VARIABLE_NAME = 'max_connections'
- THEN CONCAT(VARIABLE_VALUE, ' (当前使用率: ',
- ROUND((SELECT VARIABLE_VALUE
- FROM information_schema.GLOBAL_STATUS
- WHERE VARIABLE_NAME = 'Threads_connected') / VARIABLE_VALUE * 100, 2), '%)')
- ELSE VARIABLE_VALUE
- END AS status
- FROM information_schema.GLOBAL_STATUS
- WHERE VARIABLE_NAME IN (
- 'uptime',
- 'threads_connected',
- 'max_connections',
- 'innodb_buffer_pool_pages_free',
- 'questions',
- 'slow_queries'
- )
- UNION ALL
- SELECT
- 'buffer_pool_hit_rate',
- '',
- CONCAT(
- ROUND((1 -
- (SELECT VARIABLE_VALUE
- FROM information_schema.GLOBAL_STATUS
- WHERE VARIABLE_NAME = 'Innodb_buffer_pool_reads') /
- (SELECT VARIABLE_VALUE
- FROM information_schema.GLOBAL_STATUS
- WHERE VARIABLE_NAME = 'Innodb_buffer_pool_read_requests')
- ) * 100, 2), '%'
- )
- FROM DUAL;
复制代码总结
使用建议:
-
开发规范:
- 使用InnoDB存储引擎
- 为每张表设置主键
- 使用utf8mb4字符集
- 为频繁查询的列创建索引
- 避免在数据库中存储大文件
-
性能优化:
- 定期分析慢查询
- 监控连接数和缓冲区使用
- 定期优化和修复表
- 使用连接池
-
安全建议:
-
维护计划:
- 每日监控关键指标
- 每周备份
- 每月性能分析
- 每季度安全审计
|