MySQL 数据操纵与数据库优化

MySQL数据库的DML

一、创建(Create)

1. 基本语法

INSERT INTO 表名 [(列名1, 列名2, ...)] 
VALUES (值1, 值2, ...);
  • 省略列名条件:当值的顺序与表结构完全一致时,可省略列名(需包含所有字段值)
  • 批量插入:单条语句插入多行数据提升效率
    INSERT INTO student (id, name, score) VALUES
    (1, '张三', 99), (2, '李四', 88), (3, '王五', 77);

2. 高级技巧

  • 自增主键处理:使用AUTO_INCREMENT时,无需显式插入主键值
  • 大数据量优化:调整max_allowed_packet参数避免数据包过大错误
    SET GLOBAL max_allowed_packet = 1024*1024*100; -- 扩容至100MB[1][8]
  • 核心功能max_allowed_packet 定义了 MySQL 服务器和客户端之间传输的数据包最大允许大小。当执行大容量插入、更新或查询时,若数据包超过该限制,会触发 PacketTooBigException 错误。
  • 适用场景:处理大型 BLOB 字段、批量导入数据、数据迁移等需要传输大容量数据的操作。
  • 临时生效:通过 SET GLOBAL 修改的参数仅在当前 MySQL 服务运行期间生效,重启服务后会恢复为配置文件中的默认值。若需永久生效,需修改配置文件(如 my.cnf 或 my.ini)并重启服务。
  • 单位限制
    • 在命令行中设置时,只能使用字节数(如 1024*1024*100),不可直接使用 M 或 G 单位。
    • 在配置文件中则支持 M/G 单位(如 max_allowed_packet=100M)。
  • 取值范围:最小值为 1KB,最大值为 1GB(超过会自动调整为 1GB)。

二、读取(Retrieve)

1. 基础查询

  • 全列查询SELECT * FROM 表名(需警惕性能问题,建议指定必要字段)
  • 别名设置:增强结果可读性
    SELECT name AS 学生姓名, age+5 AS 修正年龄 FROM student;

2. 聚合函数与分组

  • 核心聚合函数
    SELECT COUNT(*) AS 总人数, AVG(score) AS 平均分,MAX(score) AS 最高分 
    FROM exam_result;
    • COUNT统计行数时推荐使用COUNT(*),避免NULL值干扰
  • 分组查询
    SELECT course_id, AVG(grade) 
    FROM study 
    GROUP BY course_id 
    HAVING AVG(grade) > 80; -- HAVING对分组后数据筛选[4][5]
    与WHERE区别:WHERE在分组前过滤,HAVING在分组后过滤

3. 子查询

  • WHERE子句嵌套
    SELECT name 
    FROM student 
    WHERE id IN (SELECT student_id FROM study WHERE course_id = 'CS101'
    );
  • FROM子句派生表
    SELECT t.dept_name, avg_salary 
    FROM (SELECT dept_id, AVG(salary) AS avg_salary FROM emp GROUP BY dept_id
    ) t;

4. 多表连接

  • 内连接:仅返回匹配记录
    SELECT s.name, sc.score 
    FROM student s 
    INNER JOIN study sc ON s.id = sc.student_id;
  • 左外连接:保留左表所有记录
    SELECT s.name, sc.score 
    FROM student s 
    LEFT JOIN study sc ON s.id = sc.student_id;

三、更新(Update)

1. 基础语法

UPDATE 表名 
SET 列名1=值1, 列名2=值2 
WHERE 条件; -- 必须指定条件避免全表更新[8][9]

示例UPDATE emp SET salary=salary*1.1 WHERE dept='研发部';

2. 级联更新

UPDATE study 
SET grade=grade+5 
WHERE course_id IN (SELECT id FROM course WHERE teacher='张教授'
);

四、删除(Delete)

1. 条件删除

DELETE FROM 表名 WHERE 条件; -- 未加条件将清空全表[8]

示例DELETE FROM log WHERE create_time < '2023-01-01';

2. 高效清空(巧用DDL)

TRUNCATE TABLE student; -- 重置自增主键,性能优于DELETE[1][8]

限制:外键约束存在时不可用,需先解除约束

五、约束与完整性

1. 主键与外键

CREATE TABLE student_course (student_id INT REFERENCES student(id) ON DELETE CASCADE,course_id INT REFERENCES course(id),PRIMARY KEY(student_id, course_id) -- 复合主键[1][5]
);
  • 级联操作ON DELETE CASCADE实现主表删除时自动清理关联数据

2. 唯一性与默认值

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,email VARCHAR(255) UNIQUE, -- 唯一约束status TINYINT DEFAULT 1 -- 默认值约束[8][9]
);

小结

MySQL CRUD操作是数据库开发的基础,掌握其正确使用规则可以提高开发效率和数据安全性。在实际应用中,需要注意以下几点:

  1. 避免频繁使用SELECT *,尽量指定需要的列。
  2. 更新和删除操作时,务必添加WHERE条件,防止误操作。
  3. 使用TRUNCATE时,确保表中没有外键约束。
  4. 合理设计表结构和约束,提高数据的完整性和一致性。

MySQL数据库优化

一、查询优化:从 SQL 到索引的全面调优

  1. EXPLAIN 分析查询(查执行计划)

    EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
    • 关键字段解读
      • typeALL(全表扫描,需优化)→ 目标优化到 ref 或 range
      • key:显示实际使用的索引,若为 NULL 表示未用索引
      • rows:预估扫描行数,数值越大性能越差
      • Extra:出现 Using filesort(额外排序)或 Using temporary(临时表)需警惕
  2. 避免全表扫描的 3 大技巧

    • 索引覆盖:确保 WHERE、JOIN、ORDER BY 涉及的列都有索引
    • 函数陷阱:禁止在索引列用函数(如 YEAR(created_at)),改用范围查询
      -- 错误:索引失效
      SELECT * FROM users WHERE YEAR(created_at) = 2023;
      -- 正确:索引生效
      SELECT * FROM users WHERE created_at BETWEEN '2023-01-01' AND '2023-12-31';
    • 模糊查询优化:避免 LIKE '%abc%',改用 LIKE 'abc%'(前缀匹配可用索引)
  3. 索引优化的黄金法则

    • 覆盖索引:查询字段全在索引中,无需回表
      CREATE INDEX idx_email_name ON users(email, name);  -- 联合索引
      SELECT email, name FROM users WHERE email = 'user@example.com';  -- 直接命中索引
    • 前缀索引:对长文本(如地址)截取前 20 字符建索引,节省空间 
      CREATE INDEX idx_title_prefix ON articles(title(20));
    • 索引避坑
      • 删除未使用的索引(如单字段索引被联合索引覆盖)
      • 联合索引顺序遵循最左前缀原则(a,b,c) 索引对 aa,b 生效,对 b,c 无效)
  4. JOIN 与分页的高效写法

    • JOIN 优化
      • 用小表驱动大表(如 FROM 小表 JOIN 大表
      • 确保关联字段有索引,避免笛卡尔积
    • 分页优化(百万级数据场景):
      -- 传统分页(慢):需扫描前 100000 行
      SELECT * FROM users LIMIT 100000, 10;
      -- 优化方案:通过覆盖索引跳过偏移量
      SELECT * FROM users 
      WHERE id >= (SELECT id FROM users ORDER BY id LIMIT 100000, 1)
      ORDER BY id LIMIT 10;

二、表结构优化:从设计到存储的进阶

  1. 数据类型选择

    • 数值型优先:用 INT 存 IP(INET_ATON() 转换),而非 VARCHAR
    • 避免 NULL:用默认值(如空字符串)替代,减少索引复杂度
    • ENUM 妙用:有限值字段(如性别)用 ENUM 比 VARCHAR 更省空间
  2. 范式与反范式的平衡

    • 范式化(减少冗余):适合写多读少场景(如日志表)
    • 反范式化(适当冗余):读多写少场景(如用户表冗余常用字段)
  3. 分区与分库分表

    • 分区表:按时间切分历史数据,加速查询
      CREATE TABLE logs (id INT, log_date DATE)
      PARTITION BY RANGE (YEAR(log_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2023 VALUES LESS THAN (2024)
      );
    • 分库分表:单表超千万行时用 ShardingSphere 分片

三、服务器参数调优:关键配置详解

  1. InnoDB 核心参数

    innodb_buffer_pool_size = 16G  # 物理内存的 70%-80%
    innodb_file_per_table = ON  # 每个表独立表空间
  2. 查询缓存慎用

    • 适用场景:读多写极少(如静态配置表)
    • 禁用场景:高并发写入时,缓存频繁失效反降低性能
      query_cache_type = 0  # 高写入场景关闭
  3. 连接与内存管理

    max_connections = 500  # 根据业务负载调整
    wait_timeout = 600  # 空闲连接 10 分钟断开
    tmp_table_size = 64M  # 增大临时表内存

四、架构优化:高可用与扩展方案

  1. 读写分离
    • 主库处理写操作,从库处理读请求(用 ProxySQL 路由)
  2. 高可用方案
    • MHA:自动故障转移,主库宕机 30 秒内切换
    • Galera Cluster:多主同步,适合写负载均衡场景
  3. 缓存与负载均衡
    • Redis 缓存热点数据:减少数据库压力
    • HAProxy:均衡读请求到多个从库

五、锁与事务优化:并发控制秘诀

  1. 隔离级别选择

    • 默认 REPEATABLE READ 适合多数场景
    • 高并发读写可用 READ COMMITTED 减少锁竞争
  2. 死锁监控与处理

    innodb_print_all_deadlocks = 1  # 记录死锁日志
    • 重试机制:代码层捕获死锁异常后自动重试

六、监控与工具:数据库的“健康管家”

  1. 内置工具

    • 慢查询日志:定位耗时 SQL 
      slow_query_log = 1
      long_query_time = 2  # 记录超过 2 秒的查询
    • SHOW PROCESSLIST:实时查看活跃连接
  2. 第三方利器

    • Percona Toolkit:分析索引效率与表结构
    • Prometheus + Grafana:可视化监控 QPS、连接数等

七、硬件与系统优化:底层性能基石

  1. 磁盘与文件系统

    • SSD 替代 HDD:随机读写性能提升 10 倍+
    • XFS 文件系统:禁用 atime 减少磁盘写入
      mount -o noatime,nodiratime /dev/sdb1 /data
  2. 内核参数调优

    • TCP 缓冲区:增大网络吞吐量
    • 文件句柄数:避免 Too many open files 错误

八、持续维护:数据库的“养生之道”

  1. 定期维护
    • 每月优化碎片化表:OPTIMIZE TABLE large_table;
    • 清理历史数据:分区表直接 DROP PARTITION
  2. 避免过度优化
    • 二八原则:优先优化 20% 高频查询
    • 业务优先:架构扩展前评估投资回报率(如分库分表成本高)

优化顺序指南

  1. 紧急处理:慢查询优化(见效最快)
  2. 结构调优:索引、表设计、分区
  3. 参数调优:InnoDB 配置、连接数
  4. 架构扩展:读写分离、缓存层
  5. 硬件升级:SSD、内存扩容

总结

MySQL 优化是持续过程,需结合业务场景选择策略。建议从 EXPLAIN 分析和索引优化入手,逐步深入架构设计。记住:“没有银弹,只有最适合的方案!”

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/82605.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    (9)被宏 QT_DEPRECATED_VERSION_X_6_0(“提示内容“) 修饰的函数,在 Qt6 中使用时,会被编译器提示该函数已过时

    &#xff08;1&#xff09;起因是看到 Qt 的官方源代码里有这样的写法&#xff1a; #if QT_DEPRECATED_SINCE(6, 0) //里面的都是废弃的成员函数QT_WARNING_PUSHQT_WARNING_DISABLE_DEPRECATEDQT_DEPRECATED_VERSION_X_6_0("Use the constructor taking a QMetaType inst…

    【bibtex4word】在Word中高效转换bib参考文献,Texlive环境安装bibtex4word插件

    前言 现已退出科研界&#xff0c;本人水货一个。希望帮到有缘人 本篇关于如何将latex环境中的参考文献bib文件转化为word&#xff0c;和一些踩坑记录。 可以看下面的资料进行配置&#xff0c;后面的文字是这些资料的补充说明。 参考文章&#xff1a;https://blog.csdn.net/g…

    Python 自动化脚本开发秘籍:从入门到实战进阶(6/10)

    摘要&#xff1a;本文详细介绍了 Python 自动化脚本开发的全流程&#xff0c;从基础的环境搭建到复杂的实战场景应用&#xff0c;再到进阶的代码优化与性能提升。涵盖数据处理、文件操作、网络交互、Web 测试等核心内容&#xff0c;结合实战案例&#xff0c;助力读者从入门到进…

    理解反向Shell:隐藏在合法流量中的威胁

    引言 在网络安全领域&#xff0c;​​反向Shell&#xff08;Reverse Shell&#xff09;​​ 是一种隐蔽且危险的攻击技术&#xff0c;常被渗透测试人员和攻击者用于绕过防火墙限制&#xff0c;获取对目标设备的远程控制权限。与传统的“正向Shell”&#xff08;攻击者主动连接…

    无人机电池储存与操作指南

    一、正确储存方式 1. 储存电量 保持电池在 40%-60% 电量&#xff08;单片电压约3.8V-3.85V&#xff09;存放&#xff0c;避免满电或空电长期储存。 满电存放会加速电解液分解&#xff0c;导致鼓包&#xff1b;**空电**存放可能引发过放&#xff08;电压低于3.0V/片会永久…

    怎样选择成长股 读书笔记(一)

    文章目录 第一章 成长型投资的困惑一、市场不可预测性的本质困惑二、成长股的筛选悖论三、管理层评估的认知盲区四、长期持有与估值波动的博弈五、实践中的认知升级路径总结&#xff1a;破解困惑的行动框架 第二章 如何阅读应计制利润表一、应计制利润表的本质与核心原则1. 权责…

    深入浅出之STL源码分析6_模版编译问题

    1.模版编译原理 当我们在代码中使用了一个模板&#xff0c;触发了一个实例化过程时&#xff0c;编译器就会用模板的实参&#xff08;Arguments&#xff09;去替换&#xff08;Substitute&#xff09;模板的形参&#xff08;Parameters&#xff09;&#xff0c;生成对应的代码。…

    无人甘蔗小车履带式底盘行走系统的研究

    1.1 研究背景与意义 1.1.1 研究背景 甘蔗作为全球最重要的糖料作物之一&#xff0c;在农业经济领域占据着举足轻重的地位。我国是甘蔗的主要种植国家&#xff0c;尤其是广西、广东、云南等地&#xff0c;甘蔗种植面积广泛&#xff0c;是当地农业经济的重要支柱产业。甘蔗不仅…

    LVGL(lv_slider滑动条)

    文章目录 一、lv_slider 是什么&#xff1f;二、创建一个滑块设置滑块的范围和初始值 三、响应滑块事件四、设置样式示例&#xff1a;更改滑块颜色和滑块按钮样式 五、纵向滑块&#xff08;垂直方向&#xff09;六、双滑块模式&#xff08;范围选择&#xff09;七、获取滑块的值…

    每日算法-250511

    每日算法 - 250511 记录一下今天刷的几道LeetCode题目&#xff0c;主要是关于贪心算法和数组处理。 1221. 分割平衡字符串 题目 思路 贪心 解题过程 我们可以遍历一次字符串&#xff0c;维护一个计数器 balance。当遇到字符 L 时&#xff0c;balance 增加&#xff1b;当遇…

    Keepalived + LVS + Nginx 实现高可用 + 负载均衡

    目录 Keepalived Keepalived 是什么&#xff08;高可用&#xff09; 安装 Keepalived LVS LVS 是什么&#xff08;负载均衡&#xff09; 安装 LVS Keepalived LVS Nginx 实现 高可用 负载均衡 Keepalived Keepalived 是什么&#xff08;高可用&#xff09; Keepaliv…

    【杂谈】-DeepSeek-GRM:让AI更高效、更普及的先进技术

    DeepSeek-GRM&#xff1a;让AI更高效、更普及的先进技术 文章目录 DeepSeek-GRM&#xff1a;让AI更高效、更普及的先进技术1、DeepSeek-GRM&#xff1a;先进的AI框架解析2、DeepSeek-GRM&#xff1a;AI开发的变革之力3、DeepSeek-GRM&#xff1a;广泛的应用前景4、企业自动化解…

    【MySQL】页结构详解:页的大小、分类、头尾信息、数据行、查询、记录及数据页的完整结构

    &#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…

    【FreeRTOS】基于G431+Cubemx自用笔记

    系列文章目录 留空 文章目录 系列文章目录前言一、从头开始创建一个FreeRTOS工程1.1 在 "Timebase Source" 中&#xff0c;选择其他TIM1.2 配置FreeRTOS的参数1. 3 添加任务 二、动态任务的创建/删除2.1 函数介绍2.1.1 创建动态任务xTaskCreate()2.1.2 创建静态任务…

    LVGL(lv_bar进度条)

    文章目录 一、lv_bar 是什么&#xff1f;二、基本使用创建一个进度条设置进度值 三、条形方向与填充方向四、范围模式&#xff08;Range&#xff09;五、事件处理&#xff08;可选&#xff09;六、自定义样式&#xff08;可选&#xff09;七、综合示例八、配合 lv_timer 或外部…

    AI对话小技巧

    角色设定&#xff1a;擅于使用 System 给 GPT 设定角色和任务&#xff0c;如“哲学大师"指令注入&#xff1a;在 System 中注入常驻任务指令&#xff0c;如“主题创作"问题拆解&#xff1a;将复杂问题拆解成的子问题&#xff0c;分步骤执行&#xff0c;如&#xff1a…

    C++ 核心基础:数字、数组、字符串、指针与引用详解

    C++ 核心基础:数字、数组、字符串、指针与引用详解 1. C++ 基础语法1.1 标识符与保留字1.2 数据类型概述1.3 基本输入输出2.1 基本整数类型(int、short、long、long long)2.2 无符号整数类型(unsigned int、unsigned short、unsigned long、unsigned long long)2.3 整数类…

    HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录

    前言 在开发运动类应用时&#xff0c;集成地图功能以及实时记录运动轨迹和公里数是核心需求之一。本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK&#xff0c;实现运动跟随以及运动公里数的记录。 一、集成百度地图 SDK 1.引入依赖 首先&#xff0c;需要在项目的文…

    如何理解k8s中的controller

    一、基本概念 在k8s中&#xff0c;Controller&#xff08;控制器&#xff09;是核心组件之一&#xff0c;其负责维护集群状态并确保集群内的实际状态与期望状态一致的一类组件。控制器通过观察集群的当前状态并将其与用户定义的期望状态进行对比&#xff0c;做出相应的调整来实…

    《Go小技巧易错点100例》第三十二篇

    本期分享&#xff1a; 1.sync.Map的原理和使用方式 2.实现有序的Map sync.Map的原理和使用方式 sync.Map的底层结构是通过读写分离和无锁读设计实现高并发安全&#xff1a; 1&#xff09;双存储结构&#xff1a; 包含原子化的 read&#xff08;只读缓存&#xff0c;无锁快…