MySQL 高效 SQL 使用技巧详解

MySQL 高效 SQL 使用 技巧详解

一、为什么需要优化 SQL?

  • 性能瓶颈:慢查询导致数据库负载升高,响应时间延长。
  • 资源浪费:低效 SQL 可能占用大量 CPU、内存和磁盘 I/O。
    目标:通过优化 SQL 将查询性能提升 10 倍以上,降低硬件成本。

二、核心优化原则

  1. 索引优先:为高频查询字段添加索引。
  2. 减少数据量:避免全表扫描,缩小查询范围。
  3. 简化逻辑:用 JOIN 替代子查询,避免复杂嵌套。
  4. 事务控制:缩短事务长度,减少锁竞争。

三、高效 SQL 实战技巧

1. 索引优化

(1)创建复合索引
-- 为 (user_id, create_time) 创建复合索引
CREATE INDEX idx_user_time ON orders(user_id, create_time);

适用场景:排序、范围查询(如 BETWEEN)。

(2)覆盖索引
-- 查询字段包含在索引中,避免回表
SELECT user_id, create_time FROM orders WHERE user_id = 100;

索引建议

CREATE INDEX idx_user_time_covering ON orders(user_id, create_time) INCLUDE (status);
(3)避免索引失效
错误写法正确写法原因
WHERE price > 100 OR status = 'paid'WHERE price > 100 AND status = 'paid'OR 导致索引失效
WHERE name LIKE '%test'WHERE name LIKE 'test%'前缀模糊查询可利用索引

2. 查询优化

(1)使用 EXPLAIN 分析执行计划
EXPLAIN SELECT * FROM users WHERE age > 30;

关键指标

  • type: 连接类型(理想值:refeq_ref)。
  • key: 使用的索引(NULL 表示全表扫描)。
  • rows: 预估扫描行数(越小越好)。
(2)分页优化

原查询(慢):

SELECT * FROM products LIMIT 100000, 10;

优化后(利用覆盖索引):

SELECT id, name FROM products 
WHERE id > (SELECT id FROM products LIMIT 100000, 1)
LIMIT 10;
(3)批量操作替代循环

错误写法

for item in data:cursor.execute("INSERT INTO logs VALUES (%s)", item)

正确写法

INSERT INTO logs (col1, col2) VALUES 
(1, 'a'), (2, 'b'), (3, 'c');

3. 事务与锁优化

(1)减少锁粒度
-- 行级锁示例(InnoDB 默认)
UPDATE users SET balance = balance - 100 WHERE id = 100;
(2)缩短事务长度

反模式

START TRANSACTION;
SELECT * FROM large_table; -- 耗时操作
UPDATE orders SET status = 'paid';
COMMIT;

优化后

START TRANSACTION;
UPDATE orders SET status = 'paid';
COMMIT;

4. 存储引擎选择

引擎特点适用场景
InnoDB支持事务、行级锁、外键高并发读写(如电商订单)
MyISAM表级锁、不支持事务读多写少(如日志表)
Memory内存存储、速度极快临时数据缓存

四、高级优化技巧

1. 子查询转 JOIN

原查询

SELECT * FROM orders 
WHERE user_id IN (SELECT id FROM users WHERE city = 'Shanghai');

优化后

SELECT o.* 
FROM orders o
JOIN users u ON o.user_id = u.id
WHERE u.city = 'Shanghai';

2. 避免 SELECT *

反模式

SELECT * FROM employees;

正确写法

SELECT id, name, email FROM employees;

3. 使用 LIMIT 限制结果集

-- 快速获取最新记录
SELECT * FROM logs ORDER BY create_time DESC LIMIT 10;

五、实战案例:优化电商订单查询

优化前 SQL

SELECT * FROM orders 
WHERE user_id = 100 AND status = 'paid'
ORDER BY create_time DESC;

问题

  • 全表扫描(无索引)。
  • 回表查询所有字段。

优化步骤

  1. 添加复合索引

    CREATE INDEX idx_user_status_time ON orders(user_id, status, create_time);
    
  2. 仅查询必要字段

    SELECT id, amount, create_time 
    FROM orders 
    WHERE user_id = 100 AND status = 'paid'
    ORDER BY create_time DESC;
    

优化后效果

  • 查询时间:从 2.1 秒降至 0.05 秒。
  • 索引覆盖度:100%(无需回表)。

六、注意事项

1. 索引维护成本

  • 索引过多会降低写入性能。
  • 建议:为查询频率高的字段创建索引。

2. 慢查询日志

-- 开启慢查询日志(超过 2 秒的查询)
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;

3. 测试环境验证

# 使用 sysbench 压测
sysbench --test=oltp --oltp-table-size=1000000 --mysql-user=root run

七、总结:高效 SQL 检查表

优化项操作工具/命令
索引使用 EXPLAIN 分析执行计划EXPLAIN
查询避免 SELECT *,使用覆盖索引EXPLAIN
事务缩短事务长度,减少锁竞争监控 InnoDB_row_lock_waits
存储引擎根据场景选择合适引擎SHOW TABLE STATUS
慢查询开启慢查询日志并分析pt-query-digest

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

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

相关文章

AI基础03-视频数据采集

上篇文章我们学习了图片的数据采集,今天主要了解一下视频数据采集的方法。视频是由一系列图像构成的,其中每一张图片就是一帧。视频数据采集方法通常有自动图像采集和基于处理器的图像采集两种。我们学习一下如何利用python 工具和笔记本计算机摄像头进行…

Scala 数组

Scala 数组 引言 Scala 作为一门多范式编程语言,融合了面向对象和函数式编程的特点。数组是编程语言中非常基础和常见的数据结构,在 Scala 中也不例外。本文将详细介绍 Scala 中的数组,包括其定义、操作以及在实际开发中的应用。 Scala 数…

Text-to-SQL将自然语言转换为数据库查询语句

有关Text-To-SQL方法,可以查阅我的另一篇文章,Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言,这段时间公司有这方面的需求,调研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…

golang 的strconv包常用方法

目录 1. 字符串与整数的转换 2. 字符串与浮点数的转换 3. 布尔值的转换 4. 字符串的转义 5. 补充:rune 类型的使用 方法功能详解 代码示例: 1. 字符串与整数的转换 方法名称功能描述示例Atoi将字符串转换为十进制整数。strconv.Atoi("123&q…

MATLAB详细图文安装教程(附安装包)

前言 MATLAB(Matrix Laboratory)是由MathWorks公司开发的一款高性能的编程语言和交互式环境,主要用于数值计算、数据分析和算法开发。内置数学函数和工具箱丰富,开发效率高,特别适合矩阵运算和领域特定问题。接下来就…

ShapeCrawler:.NET开发者的PPTX操控魔法

引言 在当今的软件开发领域,随着数据可视化和信息展示需求的不断增长,处理 PPTX 文件的场景日益频繁。无论是自动化生成报告、批量制作演示文稿,还是对现有 PPT 进行内容更新与格式调整,开发者都需要高效的工具来完成这些任务。传…

HTML5贪吃蛇游戏开发经验分享

HTML5贪吃蛇游戏开发经验分享 这里写目录标题 HTML5贪吃蛇游戏开发经验分享项目介绍技术栈核心功能实现1. 游戏初始化2. 蛇的移动控制3. 碰撞检测4. 食物生成 开发心得项目收获后续优化方向结语 项目介绍 在这个项目中,我使用HTML5 Canvas和原生JavaScript实现了一…

有关pip与conda的介绍

Conda vs. Pip vs. Virtualenv 命令对比 任务Conda 命令Pip 命令Virtualenv 命令安装包conda install $PACKAGE_NAMEpip install $PACKAGE_NAMEX更新包conda update --name $ENVIRONMENT_NAME $PACKAGE_NAMEpip install --upgrade $PACKAGE_NAMEX更新包管理器conda update con…

【Linux】调试器——gdb使用

目录 一、预备知识 二、常用指令 三、调试技巧 (一)监视变量的变化指令 watch (二)更改指定变量的值 set var 正文 一、预备知识 程序的发布形式有两种,debug和release模式,Linux gcc/g出来的二进制…

【Ubuntu常用命令】

1.将本地服务器文件或文件夹传输到远程服务器 文件 scp /data/a.txt administrator10.60.51.20:/home/administrator/ 文件夹 scp -r /data/ administrator10.60.51.20:/home/administrator/ 2.从远程服务器传输文件到本地服务器 scp administrator10.60.51.20:/data/a.txt /h…

golang 的time包的常用方法

目录 time 包方法总结 类型 time.Time 的方法 库函数 代码示例: time 包方法总结 类型 time.Time 的方法 方法名描述示例               ẵNow()获取当前时间和日期time.Now()Format()格式化时间为字符串time.Now().Format("2006-01-02 15…

Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据

作者:来自 Elastic James Williams 了解如何使用 Azure AI 文档智能解析包含文本和表格数据的 PDF 文档。 Azure AI 文档智能是一个强大的工具,用于从 PDF 中提取结构化数据。它可以有效地提取文本和表格数据。提取的数据可以索引到 Elastic Cloud Serve…

【ArcGIS操作】ArcGIS 进行空间聚类分析

ArcGIS 是一个强大的地理信息系统(GIS)软件,主要用于地理数据的存储、分析、可视化和制图 启动 ArcMap 在 Windows 中,点击“开始”菜单,找到 ArcGIS文件夹,然后点击 ArcMap 添加数据 添加数据 - 点击工具…

RabbitMQ消息相关

MQ的模式: 基本消息模式:一个生产者,一个消费者work模式:一个生产者,多个消费者订阅模式: fanout广播模式:在Fanout模式中,一条消息,会被所有订阅的队列都消费。 在广播…

缓存使用纪要

一、本地缓存:Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库,简单来说它是 Guava Cache 的优化加强版,是当下最流行、最佳(最优)缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…

2025年3月29日笔记

问题&#xff1a;创建一个长度为99的整数数组&#xff0c;输出数组的每个位置数字是几&#xff1f; 解题思路&#xff1a; 1.因为题中没有明确要求需要输入,所以所有类型的答案都需要写出 解法1&#xff1a; #include<iostream> #include<bits/stdc.h> using n…

hadoop相关面试题以及答案

什么是Hadoop&#xff1f;它的主要组件是什么&#xff1f; Hadoop是一个开源的分布式计算框架&#xff0c;用于处理大规模数据的存储和计算。其主要组件包括Hadoop Distributed File System&#xff08;HDFS&#xff09;和MapReduce。 解释HDFS的工作原理。 HDFS采用主从架构&…

微信小程序:数据拼接方法

1. 使用 concat() 方法拼接数组 // 在原有数组基础上拼接新数组 Page({data: {originalArray: [1, 2, 3]},appendData() {const newData [4, 5, 6];const combinedArray this.data.originalArray.concat(newData);this.setData({originalArray: combinedArray});} }) 2. 使…

Python之贪心算法

Python实现贪心算法(Greedy Algorithm) 概念 贪心算法是一种在每一步选择中都采取当前状态下最优的选择&#xff0c;从而希望导致结果是全局最优的算法策略。 基本特点 局部最优选择&#xff1a;每一步都做出当前看起来最佳的选择不可回退&#xff1a;一旦做出选择&#xf…

【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的 AOP:实现日志记录与性能监控

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…