什么时候会考虑用联合索引?如果只有一个条件查就没有建联合索引的必要了么?

文章内容收录到个人网站,方便阅读:hardyfish.top/

Java面试资料(阿里内部资料):

url81.ctfile.com/f/57345181-...

(访问密码:3899)

什么时候考虑使用联合索引?

联合索引(复合索引)是指在多个列上创建的索引,通常适用于以下场景:

  1. 查询涉及多个条件(多个列的 WHERE 过滤)

    • 如果查询涉及多个条件,单列索引可能无法有效利用,而联合索引可以加速查询。
    sql 复制代码
    SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
    • 如果创建 (user_id, status) 的联合索引,查询时可以有效利用索引。
  2. 索引列经常同时出现在查询中

    • 如果 col1col2 经常一起用于 WHERE 过滤、排序或分组,考虑创建 (col1, col2) 联合索引。
  3. 查询需要覆盖索引

    • 如果 SELECT 查询的列都包含在联合索引中,则可以直接使用索引数据 ,避免回表查询,提高性能(覆盖索引)。
    ini 复制代码
    SELECT user_id, status FROM orders WHERE user_id = 1001;
    • 如果存在 (user_id, status) 索引,就可以直接从索引中取数据,无需访问表数据。
  4. 索引顺序符合查询习惯

    • MySQL 索引采用最左前缀匹配原则,联合索引的列顺序影响查询是否能利用索引。

如果只有一个查询条件,是否还需要联合索引?

不一定。主要取决于以下情况:

  1. 该列是否高选择性

    • 如果查询的单个列是高选择性(区分度高,如 user_id),单列索引可能就够了。
    • 如果单列索引的选择性低(如 status 只有几种状态),联合索引可能更好。
  2. 未来查询是否会增加条件

    • 即使现在只用 WHERE col1 = ?,如果未来可能会加入 col2,创建 (col1, col2) 联合索引更合适。
  3. 是否有 ORDER BY GROUP BY 需求

    • 如果 ORDER BY col1, col2GROUP BY col1, col2 也较常见,联合索引有助于优化排序和分组。

示例分析

1. 只查询 user_id

sql 复制代码
SELECT * FROM orders WHERE user_id = 1001;
  • 如果 user_id 选择性高,单列索引 (user_id) 就够了。
  • 如果 status 也是高频过滤项,并且经常 WHERE user_id AND status,可以考虑 (user_id, status) 联合索引。

2. 既查询 user_id 又查询 status

sql 复制代码
SELECT * FROM orders WHERE user_id = 1001 AND status = 'shipped';
  • (user_id, status) 联合索引比单独的 (user_id) 更有效,避免 status 需要额外的过滤。

3. 只查询 status

sql 复制代码
SELECT * FROM orders WHERE status = 'shipped';
  • 如果 (user_id, status) 联合索引存在,但 status 不是最左前缀,索引无法完全使用,可能需要额外的单列索引 (status)

结论

  • 单列查询时,单列索引通常够用,但如果未来可能加条件,联合索引更合适。
  • 查询条件涉及多个列时,联合索引比多个单列索引更高效。
  • 索引设计要考虑:最左前缀原则、查询模式、选择性、覆盖索引等因素。
相关推荐
用户3126874877204 分钟前
@Async 加了没生效?Spring Boot 异步编程全链路拆解:从线程池到自调用陷阱
java·spring boot
老孙讲技术4 分钟前
【4G IPC 上云】临时点位怎么免布线上云?listDeviceDetailsByPage + 辅码流预览|智慧工地实战
后端·物联网
Dr.kangder17 分钟前
嵌入式面试总结(十)——流水线
单片机·嵌入式硬件·面试·职场和发展·系统架构·嵌入式
zfoo-framework17 分钟前
安装pi agent 支持duojie和deepseek
java·服务器·前端
.柒宇.1 小时前
运维常见面试题_04_Nginx与DNS服务
运维·nginx·面试·dns
铁皮饭盒1 小时前
DeepSeek V4 Pro 0813发布了, 也可以部署到 Codex 了
前端·javascript·后端
君顾11 小时前
代驾跑腿业务系统实战开发指南
java·开发语言·代驾跑腿
苏三说技术2 小时前
推荐一个牛逼的企业智能招聘系统
后端
达达尼昂2 小时前
Flutter AI Harness 如何让 Agent 参与软件开发全流程
android·人工智能·后端
NGINX开源社区2 小时前
NGINX Ingress Controller 5.5:安全性与性能提升,迁移更轻松
java·服务器·nginx