MySQL命令与高效使用指南
一、数据库生命周期管理
1.1 数据库创建规范
-- 基础创建语句
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 带条件判断的创建
CREATE DATABASE IF NOT EXISTS shop
DEFAULT CHARSET=utf8mb4
DEFAULT COLLATE utf8mb4_unicode_ci;
字符集选择建议:优先使用utf8mb4(支持emoji和更多unicode字符),排序规则根据业务需求选择通用型(如unicode_ci)或精确型(如bin)
1.2 数据库删除防护
-- 安全删除方式
DROP DATABASE IF EXISTS old_shop;
-- 高危操作防护(需配合权限控制)
REVOKE DROP ON *.* FROM 'dev_user'@'%';
1.3 数据库切换策略
-- 显式指定数据库
USE production_db;
-- 临时跨库查询
SELECT * FROM shop.orders
JOIN inventory.products
ON orders.product_id = products.id;
二、表结构设计实践
2.1 表创建模板
CREATE TABLE employees (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
emp_no VARCHAR(10) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
department ENUM('IT','HR','Finance') NOT NULL,
salary DECIMAL(10,2) CHECK (salary > 0),
join_date DATE DEFAULT (CURRENT_DATE),
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_department (department),
FULLTEXT INDEX idx_fullname (full_name)
) ENGINE=InnoDB
ROW_FORMAT=DYNAMIC
COMMENT '员工信息主表';
2.2 表结构变更规范
-- 添加字段(带位置控制)
ALTER TABLE employees
ADD COLUMN mobile VARCHAR(15)
AFTER full_name;
-- 修改字段(类型变更防护)
ALTER TABLE employees
MODIFY COLUMN salary DECIMAL(12,2)
CHECK (salary BETWEEN 3000 AND 100000);
-- 删除字段(安全检查)
ALTER TABLE employees
DROP COLUMN obsolete_field,
ALGORITHM=INPLACE, LOCK=NONE;
2.3 表维护操作
-- 表优化(碎片整理)
OPTIMIZE TABLE large_table;
-- 表修复(异常恢复)
REPAIR TABLE corrupted_table;
-- 表分析(统计信息更新)
ANALYZE TABLE important_table;
三、数据操作全指南
3.1 插入数据技巧
-- 多值插入
INSERT INTO products (name, price) VALUES
('Keyboard', 99.9),
('Mouse', 59.9),
('Monitor', 899.0);
-- 条件插入
INSERT INTO archive_orders
SELECT * FROM current_orders
WHERE order_date < '2020-01-01';
-- 忽略重复
INSERT IGNORE INTO unique_users (email)
VALUES ('test@example.com');
3.2 更新数据策略
-- 关联更新
UPDATE orders o
JOIN products p ON o.product_id = p.id
SET o.total_price = o.quantity * p.price
WHERE o.status = 'pending';
-- 条件限制更新
UPDATE user_balance
SET balance = balance + 100
WHERE user_id = 123
LIMIT 1;
-- 带子查询的更新
UPDATE employees
SET salary = salary * 1.05
WHERE department IN (
SELECT department
FROM high_performance_depts
);
3.3 删除数据安全方案
-- 软删除模式
UPDATE customers
SET deleted_at = NOW()
WHERE id = 456;
-- 分批次删除
DELETE FROM log_records
WHERE created_at < '2020-01-01'
LIMIT 1000;
-- 级联删除(需外键支持)
DELETE FROM departments
WHERE id = 5
CASCADE;
四、查询优化技巧
4.1 基础查询增强
-- 分页优化(避免OFFSET)
SELECT * FROM articles
WHERE id > 1000
ORDER BY id ASC
LIMIT 10;
-- JSON数据处理
SELECT user_id,
JSON_EXTRACT(profile, '$.address.city') AS city
FROM user_profiles
WHERE JSON_CONTAINS(profile, '"Beijing"', '$.address.city');
4.2 复杂查询模式
-- 递归查询(CTE)
WITH RECURSIVE org_tree AS (
SELECT id, name, parent_id
FROM departments
WHERE id = 1
UNION ALL
SELECT d.id, d.name, d.parent_id
FROM departments d
INNER JOIN org_tree ot ON d.parent_id = ot.id
)
SELECT * FROM org_tree;
-- 窗口函数应用
SELECT
employee_id,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS dept_rank,
AVG(salary) OVER (PARTITION BY job_title) AS avg_job_salary
FROM employees;
五、索引深度优化
5.1 索引创建策略
-- 组合索引优化
ALTER TABLE orders
ADD INDEX idx_status_date (status, order_date);
-- 前缀索引
ALTER TABLE products
ADD INDEX idx_name (name(20));
-- 函数索引(MySQL 8.0+)
ALTER TABLE users
ADD INDEX idx_email_lower ((LOWER(email)));
5.2 索引分析工具
-- 执行计划解读
EXPLAIN FORMAT=JSON
SELECT * FROM orders
WHERE user_id = 123
AND total_price > 1000;
-- 索引使用统计
SELECT
object_type,
object_schema,
object_name,
index_name,
count_read,
count_fetch
FROM performance_schema.table_io_waits_summary_by_index_usage;
六、事务与锁机制
6.1 事务控制实例
START TRANSACTION;
UPDATE accounts
SET balance = balance - 100
WHERE user_id = 1;
UPDATE accounts
SET balance = balance + 100
WHERE user_id = 2;
COMMIT;
-- 异常处理
BEGIN;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
-- 业务逻辑操作
COMMIT;
6.2 锁机制应用
-- 行级锁选择
SELECT * FROM products
WHERE id = 10
FOR UPDATE;
-- 锁等待设置
SET SESSION innodb_lock_wait_timeout = 30;
-- 死锁分析
SHOW ENGINE INNODB STATUS;
七、存储引擎对比
7.1 InnoDB最佳实践
-- 表空间管理
SET GLOBAL innodb_file_per_table = ON;
-- 缓冲池优化
SET GLOBAL innodb_buffer_pool_size = 8G;
-- 日志配置
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
7.2 MyISAM适用场景
-- 全文索引使用
SELECT * FROM documents
WHERE MATCH(content) AGAINST('MySQL optimization' IN NATURAL LANGUAGE MODE);
-- 修复表操作
REPAIR TABLE myisam_table;
八、备份与恢复方案
8.1 逻辑备份
# 全库备份
mysqldump --single-transaction -uroot -p shop > shop_full.sql
# 增量备份(配合binlog)
mysqlbinlog --start-datetime="2024-01-01 00:00:00" binlog.00001 > incr.sql
8.2 物理备份
# XtraBackup使用
innobackupex --user=root --password=secret /backup/
九、安全加固措施
9.1 用户权限管理
-- 最小权限原则
CREATE USER 'reports'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';
GRANT SELECT ON shop.sales_data TO 'reports'@'192.168.1.%';
-- 定期权限审查
SELECT * FROM mysql.user WHERE User='reports';
9.2 审计与监控
-- 开启通用日志
SET GLOBAL general_log = 'ON';
-- 性能监控
SELECT * FROM sys.session
WHERE command != 'Sleep';
十、高级功能应用
10.1 存储过程开发
DELIMITER $$
CREATE PROCEDURE ProcessOrder(IN order_id INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SELECT 'Error occurred' AS result;
END;
START TRANSACTION;
UPDATE inventory
SET stock = stock - 1
WHERE product_id = (
SELECT product_id
FROM orders
WHERE id = order_id
);
UPDATE orders
SET status = 'completed'
WHERE id = order_id;
COMMIT;
SELECT 'Order processed' AS result;
END$$
DELIMITER ;
10.2 触发器应用场景
CREATE TRIGGER update_product_stats
AFTER INSERT ON order_items
FOR EACH ROW
BEGIN
UPDATE product_stats
SET total_sold = total_sold + NEW.quantity,
last_sold = NOW()
WHERE product_id = NEW.product_id;
END;
十一、性能调优实战
11.1 查询优化案例
-- 优化前
SELECT * FROM orders
WHERE YEAR(order_date) = 2023
AND status = 'shipped';
-- 优化后
SELECT * FROM orders
WHERE order_date BETWEEN '2023-01-01' AND '2023-12-31'
AND status = 'shipped';
11.2 配置参数调整
# my.cnf优化示例
[mysqld]
innodb_buffer_pool_size = 12G
innodb_log_file_size = 2G
max_connections = 500
thread_cache_size = 100
query_cache_type = 0
十二、云数据库实践
12.1 连接管理
# SSL连接示例
mysql -h rds-instance.region.rds.amazonaws.com \
-u admin -p \
--ssl-ca=global-bundle.pem
12.2 只读副本使用
-- 读写分离配置
/* 主库 */
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
/* 从库 */
SELECT balance FROM accounts WHERE id = 1;
正文到此结束
相关文章
热门推荐
评论插件初始化中...