SQL优化手段有哪些

更多面试题请看这里:https://interview.raoyunsoft.com/

以下是一些高效的SQL优化手段,能显著提升数据库查询性能:

1. 避免使用SELECT *

只查询必要字段,减少数据传输量和内存消耗:

sql 复制代码
-- 不推荐  
SELECT * FROM users;  

-- 推荐  
SELECT id, name, email FROM users;  

2. 用JOIN替代子查询

子查询易导致性能瓶颈,优先使用连接操作:

sql 复制代码
-- 不推荐  
SELECT * FROM orders 
WHERE user_id IN (SELECT id FROM users WHERE status=1);  

-- 推荐  
SELECT o.* FROM orders o  
INNER JOIN users u ON o.user_id = u.id  
WHERE u.status = 1;  

3. 谨慎处理IN/NOT IN

改用EXISTS或连接查询,避免全表扫描:

sql 复制代码
-- 不推荐  
SELECT * FROM products 
WHERE category_id NOT IN (SELECT id FROM categories);  

-- 推荐  
SELECT p.* FROM products p  
LEFT JOIN categories c ON p.category_id = c.id  
WHERE c.id IS NULL;  

4. 优化OR条件

UNION ALL重组查询(确保无重复数据时):

sql 复制代码
-- 不推荐  
SELECT * FROM logs 
WHERE type='error' OR type='warning';  

-- 推荐  
SELECT * FROM logs WHERE type='error'  
UNION ALL  
SELECT * FROM logs WHERE type='warning';  

5. 避免!=<>操作符

会导致索引失效,改用范围查询:

sql 复制代码
-- 不推荐  
SELECT * FROM orders WHERE status <> 'canceled';  

-- 推荐  
SELECT * FROM orders  
WHERE status < 'canceled' OR status > 'canceled';  

6. 处理NULL值的正确方式

为字段设置默认值 ,避免IS NULL判断:

sql 复制代码
-- 建表时设置默认值  
ALTER TABLE employees MODIFY bonus INT DEFAULT 0;  

-- 查询优化  
SELECT * FROM employees WHERE bonus = 0;  -- 替代IS NULL  

7. 索引优化技巧

  • 避免索引列参与计算

    sql 复制代码
    -- 索引失效  
    SELECT * FROM orders WHERE YEAR(create_time) = 2023;  
    
    -- 索引生效  
    SELECT * FROM orders  
    WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31';  
  • 复合索引遵循最左匹配原则

  • 覆盖索引减少回表查询

8. 分页查询优化

深分页时使用游标替代LIMIT offset

sql 复制代码
-- 低效(offset越大越慢)  
SELECT * FROM posts ORDER BY id LIMIT 10000, 20;  

-- 高效  
SELECT * FROM posts  
WHERE id > 10000 ORDER BY id LIMIT 20;  

9. 执行计划分析

使用EXPLAIN诊断查询性能:

sql 复制代码
EXPLAIN SELECT * FROM orders 
WHERE user_id = 100 AND amount > 500;  

关键指标关注:

  • type:扫描类型(目标:ref/range)
  • key:实际使用的索引
  • rows:预估扫描行数

10. 定期维护数据库

  • 重建碎片化索引OPTIMIZE TABLE table_name
  • 更新统计信息ANALYZE TABLE table_name
  • 清理历史数据:归档或分区存储
graph TD A[SQL查询] --> B{是否高效?} B -->|否| C[分析EXPLAIN] C --> D[确认索引使用] D --> E{索引是否生效?} E -->|否| F[优化查询条件] E -->|是| G[检查连接方式] G --> H[改用JOIN/EXISTS] H --> I[验证性能提升] I -->|不足| J[考虑分库分表] I -->|达标| K[完成优化]
相关推荐
亚林瓜子16 分钟前
mysql命令行手动导入csv数据到指定表
数据库·mysql·gui·csv·cli·db·import
水库浪子952721 分钟前
工作中常用函数详解与示例-PostgreSQL(其他数据库可能函数不一致)
数据库
无名-CODING21 分钟前
栈与队列学习笔记
java·笔记
Hui Baby23 分钟前
LSM 原理、实现及与 B+ 树的核心区别
java·linux·算法
NZT-4823 分钟前
C++基础笔记(二)队列deque,queue和堆priority_queue
java·c++·笔记
Tadas-Gao28 分钟前
存储技术革命:SSD、PCIe与NVMe的创新架构设计与性能优化
java·性能优化·架构·系统架构·存储
codergjw37 分钟前
常见面试题
java
咕噜企业分发小米38 分钟前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端
想用offer打牌39 分钟前
一站式了解跨域问题
网络协议·面试·架构
李子园的李40 分钟前
函数式编程与传统编程的对比——基于java
java