1. MySQL数据库基础操作全解析作为关系型数据库的标杆产品MySQL的基础操作是每位开发者必须掌握的技能。我们先从最基础的CRUD操作开始逐步深入到复杂查询和事务处理。1.1 数据库与表的基本管理创建数据库是MySQL操作的起点这里有几个关键参数需要注意CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;提示始终明确指定字符集和排序规则避免中文乱码问题。utf8mb4是MySQL 5.5.3版本支持的全字符集比传统utf8能存储更多特殊字符如emoji。表创建时需要考虑字段类型、约束和索引CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password CHAR(60) NOT NULL COMMENT 采用bcrypt加密存储, email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_email (email) ) ENGINEInnoDB;1.2 数据增删改查进阶技巧基础的INSERT操作看似简单但批量插入时有性能优化空间-- 低效方式 INSERT INTO products (name, price) VALUES (商品A, 100); INSERT INTO products (name, price) VALUES (商品B, 200); -- 高效批量插入 INSERT INTO products (name, price) VALUES (商品A, 100), (商品B, 200), (商品C, 300);UPDATE操作需要注意WHERE条件的准确性-- 危险操作缺少WHERE条件会更新全表 UPDATE users SET status 1; -- 安全做法 UPDATE users SET status 1 WHERE id 5;1.3 复杂查询与性能优化多表连接查询是业务系统中的常见需求SELECT o.order_id, u.username, p.product_name FROM orders o JOIN users u ON o.user_id u.id JOIN order_items oi ON o.order_id oi.order_id JOIN products p ON oi.product_id p.id WHERE o.status paid ORDER BY o.created_at DESC LIMIT 10;EXPLAIN命令是查询优化的利器EXPLAIN SELECT * FROM users WHERE username LIKE 张%;执行计划会显示是否使用了索引、扫描行数等关键信息。当看到type: ALL时表示全表扫描需要考虑添加索引。1.4 事务处理与隔离级别MySQL默认采用REPEATABLE READ隔离级别但某些场景需要调整-- 设置事务隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 典型事务操作 START TRANSACTION; UPDATE accounts SET balance balance - 100 WHERE user_id 1; UPDATE accounts SET balance balance 100 WHERE user_id 2; COMMIT;事务的ACID特性保证数据一致性原子性(Atomicity)全部成功或全部失败一致性(Consistency)数据始终处于合法状态隔离性(Isolation)并发事务互不干扰持久性(Durability)提交后永久生效2. MySQL存储引擎深度对比2.1 InnoDB引擎架构解析InnoDB作为MySQL 5.5后的默认引擎采用多版本并发控制(MVCC)机制实现高并发。其核心组件包括缓冲池(Buffer Pool)缓存表和索引数据重做日志(Redo Log)保证事务持久性撤销日志(Undo Log)实现事务回滚和MVCC自适应哈希索引自动优化频繁访问数据内存结构图示----------------------- | Buffer Pool | | ------------------ | | | Data Pages | | | ------------------ | | | Index Pages | | | ------------------ | | | Adaptive Hash | | | ------------------ | -----------------------2.2 MyISAM与InnoDB的抉择关键对比指标特性InnoDBMyISAM事务支持支持不支持外键约束支持不支持锁粒度行级锁表级锁崩溃恢复支持不支持全文索引(5.6前)不支持支持存储结构聚簇索引堆表结构适用场景高并发写/事务型应用读密集型/数据仓库经验法则除非有特殊需求否则优先选择InnoDB。MyISAM适合只读或读多写少的场景如数据仓库报表。2.3 其他引擎适用场景Memory引擎数据全内存存储重启丢失适合临时表和缓存Archive引擎高压缩比适合日志类只追加数据CSV引擎数据以CSV格式存储方便与其他系统交换数据Federated引擎访问远程MySQL表类似数据库链接3. B树索引原理与优化实践3.1 B树数据结构剖析B树是InnoDB的索引实现方式与二叉树相比有以下优势高度平衡所有叶子节点在同一层非叶子节点只存键值不存数据提高扇出叶子节点通过指针连接支持高效范围查询B树查找过程示例查找键值28[10|20|30] / | \ [5|8] [15|18|19] [25|28|29] ↑ 找到283.2 索引类型与创建策略常见索引类型主键索引(PRIMARY KEY)唯一且非空表数据按主键组织唯一索引(UNIQUE KEY)保证列值唯一性普通索引(INDEX/KEY)加速查询允许重复值组合索引多列组成的索引注意最左前缀原则组合索引创建示例-- 良好实践将选择性高的列放在前面 CREATE INDEX idx_name_phone ON customers(last_name, first_name, phone); -- 低效查询无法使用索引 SELECT * FROM customers WHERE first_name John; -- 高效查询使用索引 SELECT * FROM customers WHERE last_name Smith AND first_name John;3.3 索引优化实战技巧覆盖索引优化索引包含查询所需全部字段避免回表-- 需要回表 SELECT * FROM products WHERE category electronics; -- 使用覆盖索引 ALTER TABLE products ADD INDEX idx_cat_name (category, product_name); SELECT product_name FROM products WHERE category electronics;索引选择性原则选择性不同值数量/总行数高于10%适合建索引-- 计算gender列的选择性 SELECT COUNT(DISTINCT gender)/COUNT(*) FROM users;索引失效常见场景使用函数操作WHERE YEAR(create_time) 2023隐式类型转换WHERE user_id 100user_id是整数前导模糊查询WHERE name LIKE %son4. MySQL数据类型选型指南4.1 数值类型精要整数类型存储范围对比类型字节有符号范围无符号范围TINYINT1-128 ~ 1270 ~ 255SMALLINT2-32768 ~ 327670 ~ 65535MEDIUMINT3-8388608 ~ 83886070 ~ 16777215INT4-2147483648 ~ 21474836470 ~ 4294967295BIGINT8-2^63 ~ 2^63-10 ~ 2^64-1浮点数使用建议FLOAT(4字节) 精度约7位小数DOUBLE(8字节) 精度约15位小数精确计算使用DECIMAL如DECIMAL(10,2)表示总共10位小数2位4.2 字符串与时间类型字符串类型选型矩阵类型最大长度存储特点适用场景CHAR(N)255字符定长不足补空格固定长度如MD5值VARCHAR(N)65535字节变长额外1-2字节记录长度大多数变长字符串TEXT64KB变长不存储在行记录大段文本BLOB64KB二进制数据图片、文件等二进制数据时间类型选择DATE仅日期 2023-08-20TIME仅时间 14:30:00DATETIME日期时间 2023-08-20 14:30:00TIMESTAMP时间戳自动时区转换范围1970-2038YEAR年份值4.3 JSON类型与空间数据MySQL 5.7支持原生JSON类型提供专用函数CREATE TABLE product_specs ( id INT PRIMARY KEY, specs JSON ); INSERT INTO product_specs VALUES (1, { color: black, weight: 1.5, dimensions: {width: 10, height: 20} }); -- 查询JSON字段 SELECT specs-$.color FROM product_specs WHERE id 1;空间数据类型GISPOINT坐标点LINESTRING线串POLYGON多边形GEOMETRY通用几何类型-- 查找5公里内的店铺 SELECT name FROM stores WHERE ST_Distance(location, POINT(116.404, 39.915)) 5000;5. MySQL高级特性与性能调优5.1 查询缓存与缓冲池配置虽然MySQL 8.0已移除查询缓存但在早期版本中可配置# my.cnf配置示例 query_cache_type 1 query_cache_size 64M query_cache_limit 2MInnoDB缓冲池是关键性能参数建议设置为可用内存的70-80%innodb_buffer_pool_size 12G innodb_buffer_pool_instances 8 # 减少争用监控缓冲池命中率SHOW STATUS LIKE Innodb_buffer_pool_read%; -- 计算公式 -- 命中率 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests)5.2 分区表实战应用分区表提高大表管理效率常见策略RANGE分区按日期范围分区LIST分区按离散值分区HASH分区均匀分布数据创建按月分区的订单表CREATE TABLE orders ( id INT AUTO_INCREMENT, order_date DATETIME, amount DECIMAL(10,2), PRIMARY KEY (id, order_date) ) PARTITION BY RANGE (TO_DAYS(order_date)) ( PARTITION p202301 VALUES LESS THAN (TO_DAYS(2023-02-01)), PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01)), PARTITION pmax VALUES LESS THAN MAXVALUE );5.3 主从复制与读写分离配置主从复制的基本步骤主库开启二进制日志# 主库my.cnf server-id 1 log_bin mysql-bin binlog_format ROW创建复制账号CREATE USER repl% IDENTIFIED BY password; GRANT REPLICATION SLAVE ON *.* TO repl%;从库配置# 从库my.cnf server-id 2 relay_log mysql-relay-bin read_only 1启动复制CHANGE MASTER TO MASTER_HOSTmaster_host, MASTER_USERrepl, MASTER_PASSWORDpassword, MASTER_LOG_FILEmysql-bin.000001, MASTER_LOG_POSposition; START SLAVE;读写分离实现方案中间件MySQL Router、ProxySQL应用层实现Spring AbstractRoutingDataSource云服务商方案AWS Aurora、阿里云读写分离实例6. 常见问题排查与运维技巧6.1 慢查询分析与优化启用慢查询日志# my.cnf配置 slow_query_log 1 slow_query_log_file /var/log/mysql/mysql-slow.log long_query_time 2 # 超过2秒记录 log_queries_not_using_indexes 1使用pt-query-digest分析慢日志pt-query-digest /var/log/mysql/mysql-slow.log slow_report.txt常见优化手段为慢查询添加适当索引重写复杂查询分解为多个简单查询避免SELECT *只查询必要字段优化JOIN操作确保关联字段有索引6.2 锁等待与死锁处理查看当前锁情况SHOW ENGINE INNODB STATUS\G -- 查看锁等待 SELECT * FROM performance_schema.events_waits_current;处理死锁的典型步骤分析死锁日志SHOW ENGINE INNODB STATUS确认事务隔离级别检查事务执行顺序是否一致添加合理的索引减少锁定范围考虑重试机制减少锁冲突的建议保持事务短小精悍按固定顺序访问多表使用较低的隔离级别如READ COMMITTED避免用户交互在事务中6.3 备份恢复策略物理备份与逻辑备份对比类型工具优点缺点物理备份xtrabackup快速适合大数据库不兼容不同MySQL版本逻辑备份mysqldump可读性强兼容性好恢复慢锁表风险快照备份LVM/ZFS几乎瞬时完成需要特定文件系统支持mysqldump实用命令# 完整备份 mysqldump -u root -p --all-databases --single-transaction full_backup.sql # 单库备份 mysqldump -u root -p --databases dbname db_backup.sql # 恢复数据 mysql -u root -p full_backup.sqlxtrabackup热备份基本流程# 全量备份 xtrabackup --backup --target-dir/backups/full --userroot --password # 准备备份应用redo log xtrabackup --prepare --target-dir/backups/full # 增量备份 xtrabackup --backup --target-dir/backups/inc1 \ --incremental-basedir/backups/full --userroot --password在实际运维中我通常会采用xtrabackup做每日全备binlog增量备份的组合策略。对于特别重要的数据还会设置延迟复制从库作为应急恢复手段。记住没有测试过的备份等于没有备份定期进行恢复演练至关重要。
阅读完成 · 觉得有帮助?