当前位置:首页 > 技术文章 > 正文内容

java面试题:sql 语句优化, 说出你知道的?

arlanguage1个月前 (03-28)技术文章19

一、优化方向与核心原则

  1. 减少数据访问量
  2. 避免 SELECT *,仅查询需要的字段。
  3. 使用 LIMIT 分页,结合覆盖索引优化大表分页(如延迟关联)。
  4. 减少计算开销
  5. 避免在 WHERE 子句中对字段进行函数操作(如 WHERE YEAR(create_time) = 2023)。
  6. 简化复杂子查询,改用 JOIN 或临时表。
  7. 利用索引高效检索
  8. 遵循 最左前缀原则 设计联合索引。
  9. 区分度高(基数大)的列优先建索引(如用户ID vs 性别)。

二、具体优化手段

1. 索引优化

  • 场景示例
-- 低效写法(索引失效)
SELECT * FROM orders WHERE amount * 2 > 1000;

-- 优化后(保持字段独立)
SELECT * FROM orders WHERE amount > 1000 / 2;
  • 索引失效场景
    • 隐式类型转换(如字符串字段用数字查询)。
    • LIKE 以通配符开头(LIKE '%abc')。
    • 对索引列使用 NOT、!= 或 OR 条件。

2. 查询语句优化

  • 避免全表扫描
-- 低效写法
SELECT * FROM user WHERE status IS NULL;

-- 优化方案:为 status 设置默认值(如 0),并建索引。
  • 优化 JOIN 操作
    • 小表驱动大表(如小表在 LEFT JOIN 左侧)。
    • 避免 JOIN 过多表(通常不超过 3 个)。
  • 分页优化
-- 低效写法(偏移量大时)
SELECT * FROM logs LIMIT 1000000, 10;

-- 优化写法(延迟关联)
SELECT * FROM logs 
WHERE id >= (SELECT id FROM logs ORDER BY id LIMIT 1000000, 1)
LIMIT 10;

3. 执行计划分析

  • 使用 EXPLAIN 或 EXPLAIN ANALYZE:
    • 关注字段
      • type:ALL(全表扫描)需优化为 ref、range 等。
      • key:实际使用的索引。
      • rows:扫描行数(越小越好)。
      • Extra:Using filesort(需优化排序)、Using temporary(避免临时表)。

三、表设计与架构优化

  1. 合理分库分表
  2. 垂直拆分:按业务拆分(如用户表与订单表分离)。
  3. 水平拆分:按时间或哈希分片(如按用户ID取模)。
  4. 选择合适的数据类型
  5. 用 INT 而非 VARCHAR 存储数值型主键。
  6. 避免 TEXT 大字段频繁查询,可分离到扩展表。
  7. 冷热数据分离
  8. 历史数据归档(如订单表按年月分区)。

四、高级技巧与工具

  1. 批量操作代替循环
-- 低效写法(逐条插入)
INSERT INTO table (col) VALUES (1);
INSERT INTO table (col) VALUES (2);

-- 高效写法
INSERT INTO table (col) VALUES (1), (2);
  1. 使用预编译语句
  2. 防止 SQL 注入,同时减少解析开销(如 MyBatis 的 #{})。
  3. 监控与调优工具
  4. 慢查询日志(MySQL 的 slow_query_log)。
  5. 性能分析工具:pt-query-digest、Percona Toolkit。

五、实战案例

场景:某电商订单查询接口超时

SELECT * FROM orders WHERE user_id = 1001 ORDER BY create_time DESC LIMIT 10;
  • 问题分析
    • user_id 无索引,导致全表扫描。
    • ORDER BY 未利用索引排序,产生 Using filesort。
  • 优化步骤
  • 为 user_id 和 create_time 创建联合索引:
ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time);
  • 仅查询必要字段:
SELECT order_id, amount, status FROM orders WHERE user_id = 1001 ORDER BY create_time DESC LIMIT 10;

六、总结

优化维度

关键手段

效果

索引设计

最左前缀、覆盖索引、避免失效场景

减少扫描行数

SQL 语句

简化查询、小表驱动、分页优化

降低计算开销

执行计划分析

EXPLAIN 解析 type 和 Extra 字段

定位性能瓶颈

架构设计

分库分表、冷热分离

提升横向扩展能力

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/3640.html

分享给朋友:

“java面试题:sql 语句优化, 说出你知道的?” 的相关文章

Nginx笔记

内容介绍 1、nginx基本概念。(1) nginx是什么,能做什么事情(2) 反向代理。(3) 负载均衡。(4) 动静分离2、nginx 安装、常用命令和配置文件(1)在liunx系统中安装nginx.(2) nginx常用命令。(3) nginx 配置文件。3、nginx 配置实例 1-反向代理...

Nginx配置七层负载均衡

Nginx 一般用于七层负载均衡,其吞吐量有一定限制。为了提升系统整体吞吐量,会在 DNS 与 Nginx 之间引入接入层,比如使用LVS(软负载均衡器)、F5(硬负载均衡器)做四层负载均衡。整体的请求流转如下图所示,即首先 DNS 解析到 LVS/F5,然后 LVS/F5 转发给 Nginx,再由...

Nginx——location常见配置指令,alias、root、proxy_pass

1、【alias】——别名配置,用于访问文件系统,在匹配到location配置的URL路径后,指向【alias】配置的路径。如: location /test/ { alias/first/second/img/; }即:请求/test/1.jpg(省略了协议与域名),将会返回文件/first...

路由虚拟服务器nginx转发400问题

背景:关于网络和硬件:旧服务基本是在公有云服务器或提供公网IP的服务器操作的。关于服务:后端jar服务运行,前端vue生成的包并通过nginx转发。以前的nginx配置文件:location / { root /data/project/web/; try...

Vue3项目没有独立域名靠路径分发的痛苦部署方式

Vue3项目部署注意事项,特别是如果有路径分发,没有独立域名的情况,会遇到各种刷新404页面的问题,那怎么解决呢?root和alias的区别nginx配置文件中,指定静态资源路径时,root和alias的区别路径拼接方式: 使用root时,location块中指定的URI将会直接拼接到root路径后...

Nginx从安装到高可用,一篇搞定 nginx安装方式

一、Nginx安装1、去官网http://nginx.org/下载对应的nginx包,推荐使用稳定版本2、上传nginx到linux系统3、安装依赖环境(1)安装gcc环境yum install gcc-c++ (2)安装PCRE库,用于解析正则表达式yum install -y pcre pcre...