编程 SQL常用优化的技巧

2024-11-18 15:56:06 +0800 CST views 408

SQL常用优化的技巧

1. 避免使用 SELECT *

查询时只选取需要的列,避免使用 SELECT *,减少不必要的数据查询和传输。

SELECT name, age FROM user WHERE id = 1;

2. 用 UNION ALL 代替 UNION

使用 UNION ALL 获取所有数据,包括重复的,避免 UNION 的去重操作,减少CPU资源消耗。

(SELECT * FROM user WHERE id = 1)
UNION ALL
(SELECT * FROM user WHERE id = 2);

3. 小表驱动大表

使用小表的数据集来驱动大表的数据集,例如使用 INEXISTS,根据实际情况选择合适的关键字。

SELECT * FROM orders WHERE user_id IN (SELECT id FROM user WHERE status = 1);

4. 批量操作

批量插入或更新数据,减少数据库请求次数,提升性能。

INSERT INTO orders (id, code, user_id) 
VALUES (123, '001', 100), (124, '002', 100), (125, '003', 101);

5. 多用 LIMIT

使用 LIMIT 限制查询结果数量,提高查询效率,同时在删除或修改操作中使用,以避免误操作。

SELECT id, create_date FROM orders WHERE user_id = 123 ORDER BY create_date ASC LIMIT 1;

6. IN 中值太多

IN 子句中的值进行限制,避免查询大量数据导致接口超时。

SELECT id, name FROM category WHERE id IN (1, 2, 3, ..., 100) LIMIT 500;

7. 增量查询

通过条件限制,每次只查询部分数据,提高同步效率。

SELECT * FROM user WHERE id > #{lastId} AND create_time >= #{lastCreateTime} LIMIT 100;

8. 高效分页

使用 LIMIT 进行分页时,对于大数据量的表,使用 id 范围查询代替偏移量分页。

SELECT id, name, age FROM user WHERE id > 1000000 LIMIT 20;

9. 用连接查询代替子查询

使用连接查询代替子查询,减少临时表的创建和删除,提高查询效率。

SELECT o.* 
FROM orders o 
INNER JOIN user u ON o.user_id = u.id 
WHERE u.status = 1;

10. JOIN 的表不宜过多

控制 JOIN 表的数量,避免复杂的索引选择和性能消耗。

SELECT a.name, b.name, c.name 
FROM a 
INNER JOIN b ON a.id = b.a_id 
INNER JOIN c ON c.b_id = b.id;

11. JOIN 时要注意

使用 INNER JOIN 时,小表驱动大表;使用 LEFT JOIN 时,注意左边应为小表。

SELECT o.id, o.code, u.name 
FROM orders o 
INNER JOIN user u ON o.user_id = u.id 
WHERE u.status = 1;

12. 控制索引的数量

合理控制索引数量,避免过多的索引导致性能消耗。

13. 选择合理的字段类型

根据数据特点选择合适的字段类型,例如 CHARVARCHAR,以及数字类型和字符串类型的选择。

ALTER TABLE orders ADD COLUMN code CHAR(20) NOT NULL;

14. 提升 GROUP BY 的效率

GROUP BY 前使用 WHERE 条件过滤数据,减少分组操作的数据量。

SELECT user_id, user_name 
FROM orders 
WHERE user_id <= 200 
GROUP BY user_id;

15. 索引优化

使用 EXPLAIN 命令检查SQL语句是否走索引,避免索引失效,并在必要时使用 FORCE INDEX 强制使用特定索引。

EXPLAIN SELECT * FROM orders WHERE code = '002';
复制全文 生成海报 数据库 性能优化 SQL

推荐文章

如何在Vue3中处理全局状态管理?
2024-11-18 19:25:59 +0800 CST
Python 基于 SSE 实现流式模式
2025-02-16 17:21:01 +0800 CST
在Rust项目中使用SQLite数据库
2024-11-19 08:48:00 +0800 CST
java MySQL如何获取唯一订单编号?
2024-11-18 18:51:44 +0800 CST
一些实用的前端开发工具网站
2024-11-18 14:30:55 +0800 CST
MySQL 优化利剑 EXPLAIN
2024-11-19 00:43:21 +0800 CST
IP地址获取函数
2024-11-19 00:03:29 +0800 CST
Vue3中如何进行错误处理?
2024-11-18 05:17:47 +0800 CST
阿里云免sdk发送短信代码
2025-01-01 12:22:14 +0800 CST
Vue 中如何处理父子组件通信?
2024-11-17 04:35:13 +0800 CST
五个有趣且实用的Python实例
2024-11-19 07:32:35 +0800 CST
为什么要放弃UUID作为MySQL主键?
2024-11-18 23:33:07 +0800 CST
filecmp,一个Python中非常有用的库
2024-11-19 03:23:11 +0800 CST
js一键生成随机颜色:randomColor
2024-11-18 10:13:44 +0800 CST
Vue3中如何处理组件的单元测试?
2024-11-18 15:00:45 +0800 CST
mysql删除重复数据
2024-11-19 03:19:52 +0800 CST
# 解决 MySQL 经常断开重连的问题
2024-11-19 04:50:20 +0800 CST
Vue3中如何使用计算属性?
2024-11-18 10:18:12 +0800 CST
乐观锁和悲观锁,如何区分?
2024-11-19 09:36:53 +0800 CST
Python 获取网络时间和本地时间
2024-11-18 21:53:35 +0800 CST
程序员茄子在线接单