问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

SQL查询优化,让你的数据库飞起来!

创作时间:
作者:
@小白创作中心

SQL查询优化,让你的数据库飞起来!

引用
CSDN
18
来源
1.
https://blog.csdn.net/lgbingyu00/article/details/139648322
2.
https://blog.csdn.net/km_bandits/article/details/139716271
3.
https://blog.csdn.net/WuLex/article/details/114464385
4.
https://blog.csdn.net/weixin_40205839/article/details/140366288
5.
https://m.blog.csdn.net/a342874650/article/details/138492418
6.
https://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/postgresql-query-tuning/introduction.html
7.
https://blog.csdn.net/chaopi_/article/details/139140609
8.
https://blog.csdn.net/beiback/article/details/138655402
9.
https://blog.csdn.net/LycLhsYYY/article/details/143972159
10.
https://m.blog.csdn.net/lgbingyu00/article/details/139648322
11.
https://blog.csdn.net/qq_16204521/article/details/140948081
12.
https://juejin.cn/post/7390646355028541467
13.
https://www.cnblogs.com/yeyuzhuanjia/p/18607076
14.
https://juejin.cn/post/7441857319640530970
15.
https://www.cnblogs.com/johnnyzen/p/18545632
16.
https://cloud.tencent.com/developer/article/2456638
17.
https://www.cnblogs.com/Chatdanta/p/18296203
18.
https://www.rockdata.net/zh-cn/tutorial/postgres-optimization/

在现代软件开发中,SQL查询优化是提高应用程序性能的关键环节。通过合理使用索引、编写高效的查询语句、选择合适的数据类型和进行分区等方法,你可以更高效地使用SQL进行查询优化。这些技巧不仅适用于MySQL,还适用于其他数据库管理系统,如PostgreSQL和大数据平台。掌握这些最佳实践,让你的数据库性能大幅提升,让你的应用程序运行得更快、更稳定。

01

基础优化原则

有效使用索引

索引是提高查询性能的重要手段。确保WHERE子句和JOIN条件中涉及的列都已被索引。例如:

CREATE INDEX idx_user_id ON users(user_id);

避免使用SELECT *

只选择你需要的列,而不是使用SELECT *。例如:

SELECT order_id, customer_id, order_date FROM orders;

优化JOIN语句

当只需要匹配的行时,使用INNER JOIN;当需要左表的所有行时,使用LEFT JOIN。例如:

SELECT users.name, orders.order_id FROM users INNER JOIN orders ON users.user_id = orders.user_id;

使用LIMIT限制结果

当你不需要所有结果时,使用LIMIT限制返回的行数。例如:

SELECT * FROM products LIMIT 10;

避免子查询

尽可能将子查询重写为JOIN,以提高性能。例如:

SELECT name FROM products WHERE category_id = (SELECT category_id FROM categories WHERE name = 'Electronics');

可以重写为:

SELECT p.name FROM products p JOIN categories c ON p.category_id = c.category_id WHERE c.name = 'Electronics';

使用UNION代替OR

用UNION替换多个OR条件以获得更高效的查询。例如:

SELECT * FROM products WHERE price > 100 OR category = 'Electronics';

可以重写为:

SELECT * FROM products WHERE price > 100 UNION SELECT * FROM products WHERE category = 'Electronics';

避免在LIKE查询开始时使用通配符

LIKE以%开头无法利用索引,尽可能避免。例如:

name LIKE 'app%';

而不是:

name LIKE '%app%';

批量插入和更新

插入或更新多行时,使用批处理语句。例如:

INSERT INTO products (name, price) VALUES ('Product1', 10), ('Product2', 20), ('Product3', 30);

避免在WHERE中使用函数

将函数应用于WHERE子句中的列可以防止索引的使用。例如:

WHERE order_date >= '2023-01-01' AND order_date < '2024-01-01';

而不是:

WHERE YEAR(order_date) = 2023;
02

索引优化技巧

避免回表查询

建立联合索引,把查询的列建在联合索引中,这样可以避免回表查询。

避免范围查询导致的联合索引失效

在复合索引中,如果使用范围查询(如>、<等),则该列之后的所有列都无法使用索引。

注意数据类型隐式转换

数据类型出现隐式转换,会导致索引失效,造成全表扫描效率极低。

避免索引列参与计算或使用函数

索引列参与计算或使用函数,也会导致索引失效。

03

JOIN语句优化

理解不同类型的JOIN语句:

  • INNER JOIN:返回两个表中满足连接条件的记录
  • LEFT JOIN:返回左表中的所有记录,以及右表中满足连接条件的记录
  • RIGHT JOIN:返回右表中的所有记录,以及左表中满足连接条件的记录
  • FULL JOIN:返回两个表中的所有记录,如果没有匹配的记录,则为NULL
  • CROSS JOIN:返回两个表的笛卡尔积

注意ON条件和WHERE子句的执行顺序:

SELECT * FROM A LEFT JOIN B ON A.ID = B.ID AND A<>0 WHERE A.name = 'x';

执行顺序是:

  1. 先将两张表根据ON条件作连接
  2. 根据ON后面, WHERE之前 的AND条件筛选数据
  3. 根据LEFT无论如何,要保证A表的数据完整性。所以在上一步骤产生的结果集中补齐A表因无法比与B表匹配而被AND条件筛选的掉的数据;
  4. 再根据WHERE筛选结果集。
04

大数据量查询优化

合理设计数据库结构

良好的数据库设计是查询优化的基础。我们需要确保表结构合理,字段类型正确,并且对常用查询字段建立索引。

使用分区表

对于大数据量的表,可以使用分区表来提高查询性能。分区表将数据按某种规则分为多个物理块,每次查询只需扫描相关分区的数据,从而提高查询效率。

例如:

CREATE TABLE user_logs (
    id BIGINT NOT NULL,
    user_id BIGINT NOT NULL,
    action VARCHAR(255) NOT NULL,
    action_time TIMESTAMP NOT NULL,
    PRIMARY KEY (id, action_time)
) PARTITION BY RANGE (YEAR(action_time)) (
    PARTITION p2021 VALUES LESS THAN (2022),
    PARTITION p2022 VALUES LESS THAN (2023),
    PARTITION p2023 VALUES LESS THAN (2024)
);

使用缓存

对于一些频繁查询的数据,可以使用缓存(如Redis)来减少数据库压力。缓存可以存储热点数据,显著提高查询性能。

调整服务器配置

根据你的服务器硬件和应用需求,调整缓存参数、线程和连接参数等。

05

案例分析

假设我们有一个存储用户日志的表user_logs:

CREATE TABLE user_logs (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT NOT NULL,
    action VARCHAR(255) NOT NULL,
    action_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_user_id (user_id),
    INDEX idx_action_time (action_time)
);

我们需要查询用户ID为12345且操作时间在2023年之后的所有日志:

EXPLAIN SELECT * FROM user_logs WHERE user_id = 12345 AND action_time > '2023-01-01';

通过EXPLAIN分析执行计划,我们可以确认查询是否使用了索引,以及扫描的行数。尽量避免使用全表扫描,确保查询条件能够利用索引。

06

总结

SQL查询优化是一个系统性工程,需要从数据库设计、索引优化、查询语句优化等多个维度进行考虑。通过合理使用索引、优化查询语句、选择合适的数据类型和进行分区等方法,可以显著提升数据库查询性能。希望本文能帮助你更好地理解和应用SQL查询优化技巧,让你的应用程序运行得更快、更稳定。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号