Mysql优化的查询语句(1)

embedded/2025/2/11 19:54:07/

SQL 查询优化是一个系统性工程,除了你提到的几点,我再补充一些优化建议,帮助提升数据库查询效率:


1. 避免 SELECT *,只查询需要的字段

问题:

SELECT * FROM users WHERE id = 100;
  • SELECT * 会获取表中所有字段,可能会增加 I/O 负担,尤其是在大表查询时。

优化:

SELECT name, email FROM users WHERE id = 100;

只查询必要的字段,减少数据传输和解析时间。


2. 使用合适的索引

问题:

SELECT * FROM orders WHERE YEAR(created_at) = 2024;
  • YEAR(created_at) 使用了函数,导致索引失效,数据库无法直接利用 created_at 索引。

优化:

SELECT * FROM orders WHERE created_at >= '2024-01-01' AND created_at < '2025-01-01';
  • 这样可以让数据库利用索引,避免对每一行进行函数运算。

3. 尽量使用 EXISTS 代替 IN

问题:

SELECT * FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);
  • 如果 orders 结果集很大,IN 会导致全表扫描,影响查询效率。

优化:

SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.amount > 1000
);
  • EXISTS 在匹配到第一条数据时就会终止搜索,性能更优。

4. JOIN 连接表时,确保连接字段有索引

问题:

SELECT users.name, orders.amount 
FROM users 
JOIN orders ON users.id = orders.user_id 
WHERE orders.amount > 100;
  • 如果 orders.user_id 没有索引,会导致全表扫描。

优化:

CREATE INDEX idx_orders_user_id ON orders(user_id);
  • 确保连接字段有索引,加速 JOIN 查询。

5. 使用 LIMIT 限制返回行数

问题:

SELECT * FROM logs ORDER BY created_at DESC;
  • 如果 logs 表有大量数据,会扫描整个表并排序。

优化:

SELECT * FROM logs ORDER BY created_at DESC LIMIT 100;
  • LIMIT 限制返回行数,减少数据读取量。

6. 避免 OR,改用 UNION ALL

问题:

SELECT * FROM users WHERE name = 'Alice' OR email = 'alice@example.com';
  • OR 可能导致索引失效。

优化:

SELECT * FROM users WHERE name = 'Alice'
UNION ALL
SELECT * FROM users WHERE email = 'alice@example.com';
  • UNION ALL 在某些情况下可以提高性能,因为它避免了 OR 可能带来的全表扫描。

7. 避免使用 OFFSET 进行深度分页

问题:

SELECT * FROM orders ORDER BY created_at DESC LIMIT 10 OFFSET 100000;
  • 数据量大时,OFFSET 会导致数据库扫描大量行,影响性能。

优化:

SELECT * FROM orders 
WHERE created_at < (SELECT created_at FROM orders ORDER BY created_at DESC LIMIT 1 OFFSET 100000) 
ORDER BY created_at DESC 
LIMIT 10;
  • 这样能减少扫描的行数,提高查询效率。

8. 使用适当的数据类型

问题:

CREATE TABLE users (id BIGINT NOT NULL,name VARCHAR(255),age INT
);
  • VARCHAR(255) 太长,如果 name 的数据通常在 50 个字符以内,可以使用 VARCHAR(50),减少存储开销。
  • BIGINT 可能比 INT 多占用 4 个字节,如果 id 不超过 21 亿(2^31-1),可以使用 INT

优化:

CREATE TABLE users (id INT NOT NULL,name VARCHAR(50),age TINYINT UNSIGNED
);
  • 使用合适的数据类型,减少存储空间,提高查询效率。

9. 避免 DISTINCT,可以使用 GROUP BY

问题:

SELECT DISTINCT category FROM products;
  • DISTINCT 需要额外排序,可能影响性能。

优化:

SELECT category FROM products GROUP BY category;
  • 在某些数据库中,GROUP BY 可能比 DISTINCT 更快。

10. 避免 ORDER BY RAND() 进行随机排序

问题:

SELECT * FROM users ORDER BY RAND() LIMIT 10;
  • RAND() 需要为每一行生成随机数并排序,效率很低。

优化:

SELECT * FROM users WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM users))) LIMIT 10;
  • 这样能快速获取随机记录,而不影响索引。

11. 使用 EXPLAIN 检查查询计划

在优化 SQL 语句时,可以使用 EXPLAIN 来分析查询是否使用了索引:

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

如果 type 列显示 ALL,表示全表扫描,说明索引没有生效,需要优化。


总结

优化查询的关键点

  1. 避免 SELECT *,只查询需要的字段。
  2. WHERE 条件和 JOIN 连接字段上建立索引
  3. 避免 LIKE '%XX%',可以用全文索引
  4. 避免自动类型转换,确保 WHERE 条件的类型匹配
  5. 使用 EXISTS 代替 IN,避免大数据量子查询的低效问题
  6. 深度分页时,使用 WHERE 过滤来减少 OFFSET 造成的性能损失
  7. 尽量使用 UNION ALL 代替 OR,提高查询效率
  8. 优化数据类型,减少存储空间,提高索引效率
  9. GROUP BY 替代 DISTINCT,避免额外排序
  10. 避免 ORDER BY RAND(),改用随机 ID 选择方法
  11. 使用 EXPLAIN 分析查询计划,确保索引生效

做好这些优化,可以极大提高 SQL 查询的执行效率,减少数据库负载。🚀


http://www.ppmy.cn/embedded/161406.html

相关文章

P3654 First Step (ファーストステップ)(贪心算法)

#include<bits/stdc.h> using namespace std;int main() {int r,c,k;cin>>r>>c>>k;char a[105][105];int ans0;for(int i0;i<r;i){for(int j0;j<c;j){cin>>a[i][j];}}for(int i0;i<r;i){int cnt0; // 用来记录连续空地的数量for(int j…

5分钟搭建企业级AI问答知识库

5分钟搭建企业级AI问答知识库 基础概念部署过程使用体验 基础概念 在开始搭建企业级AI问答知识库之前&#xff0c;先来了解一下今天操作过程中用到的三个概念&#xff1a; 概念一&#xff1a;模型在线服务PAI-EAS&#xff08;Elastic Algorithm Service&#xff09;是模型在线…

计算机毕业设计hadoop++hive微博舆情预测 微博舆情分析 微博推荐系统 微博预警系统 微博数据分析可视化大屏 微博情感分析 微博爬虫 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

STM32启动过程概述

1. STM32启动过程概述 STM32 微控制器的启动过程是指从上电或复位开始&#xff0c;到系统开始执行用户程序的整个过程。这个过程包括了硬件初始化、引导加载程序 (Bootloader) 执行、系统时钟配置、外设初始化等步骤。 2. STM32 启动的基本流程 上电或复位 STM32 芯片的启动过…

教育机器人的智能驱动:揭秘舵机技术的无限可能

在这个科技日新月异的时代&#xff0c;教育机器人正逐渐成为学生们探索科技世界的新窗口。它们不仅承载着编程与机械知识的融合&#xff0c;更以其独特的智能驱动方式&#xff0c;引领着下一代对科技的兴趣与探索。而在这场科技教育的盛宴中&#xff0c;舵机以其高精度和可靠性…

CRM系统中的数据分析和报表功能如何帮助企业?

CRM系统中的数据分析和报表功能&#xff1a;企业战略决策的得力助手 在当今竞争激烈的商业环境中&#xff0c;企业要想保持竞争力并实现持续增长&#xff0c;必须依靠精准的数据分析来制定有效的战略决策。而客户关系管理&#xff08;CRM&#xff09;系统的数据分析与报表生成…

openCV函数使用(一)

读取图像&#xff1a; 中文路径乱码问题&#xff1a; QString filepath QFileDialog::getOpenFileName(this, str); QByteArray cdata filepath.toLocal8Bit();读取灰度图像&#xff1a; imread(std::string(cdata), cv::IMREAD_GRAYSCALE);读取彩色图像&#xff1a; imre…

探索 Amazon Aurora DSQL:基本操作全解析(系列①)

1. 引言 在业务中&#xff0c;我使用 Aurora Global Database (PostgreSQL)&#xff0c;通常配置为 东京&#xff08;Act&#xff09; 和 大阪&#xff08;Sby&#xff09;&#xff0c;以便在灾害或大规模故障发生时能够进行系统切换。 在 Aurora DSQL 中&#xff0c;两个区域…