简短回答:子查询本身不是一个“可被索引的对象”,但子查询里访问的表、列,如果符合索引使用条件,是可以使用索引的。
下面分层说明一下。
✅ 错误理解:
CREATE INDEX idx ON (SELECT ...); -- 不存在
例如:
SELECT *
FROM orders
WHERE user_id IN (
SELECT user_id
FROM users
WHERE age > 30
);
users.age 如果有索引 → 子查询里可用orders.user_id 如果有索引 → 外层可用执行时,数据库优化器可能:
SELECT
id,
(SELECT MAX(amount) FROM pay WHERE pay.uid = u.id)
FROM u;
pay.uid 有索引 → 高效SELECT *
FROM orders o
WHERE EXISTS (
SELECT 1
FROM users u
WHERE u.id = o.user_id
AND u.status = 1
);
users.id / users.status 有索引 → 很好SELECT *
FROM (
SELECT * FROM orders WHERE create_time > '2024-01-01'
) t
WHERE amount > 100;
✅ 优化方式:
WHERE不是“是不是子查询”,而是:
OR / != / NOT IN子查询不建索引,但子查询里的表可以用索引;是否能用,取决于执行计划和写法,而不是“子查询”三个字。
如果你愿意,可以贴一条具体 SQL,我可以直接帮你判断 会不会走索引、怎么优化。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。