在 SQL 中,“避免全表扫描(Full Table Scan)”的核心目标是让数据库能够使用索引来定位数据,而不是逐行扫描整张表。下面从建表、写 SQL、数据库配置三个层面系统说明。
CREATE INDEX idx_user_age ON user(age);
INDEX(a, b, c)
✅ 能命中:
WHERE a=1
WHERE a=1 AND b=2
WHERE a=1 AND b=2 AND c=3
❌ 不会命中:
WHERE b=2
WHERE c=3
❌ 全表扫描:
WHERE YEAR(create_time) = 2024
✅ 改写:
WHERE create_time >= '2024-01-01'
AND create_time < '2025-01-01'
❌
WHERE phone = 13800000000 -- phone 是 varchar
✅
WHERE phone = '13800000000'
OR(可用 UNION 替代)❌
WHERE a=1 OR b=2
✅
SELECT * FROM t WHERE a=1
UNION
SELECT * FROM t WHERE b=2
!=、<>、NOT IN、NOT LIKE这些通常导致索引失效 ❌
WHERE status != 1
✅ 用范围或正向条件
❌
WHERE name LIKE '%张'
✅
WHERE name LIKE '张%'
SELECT id, name FROM user WHERE age=20
如果 (age, name, id) 是联合索引,可避免回表。
SELECT *-- MySQL
ANALYZE TABLE user;
-- PostgreSQL
ANALYZE user;
SELECT * FROM user FORCE INDEX(idx_age) WHERE age=20;
如果你有具体 SQL 或表结构,我可以直接帮你分析为什么会全表扫描,并给出改写方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。