SQL索引需建表前预判、线上安全添加并避开失效陷阱。主键自动建聚簇索引;外键和高频查询字段应手动建索引;组合索引遵循最左前缀原则;MySQL用ALGORITHM=INPLACE,PostgreSQL用CONCURRENTLY;避免对索引列使用函数或运算。

SQL索引不是“建了就快”,关键在选对字段、用对类型、避开常见坑。下面按真实开发节奏,一步步带你从建表前预判到上线后优化,覆盖大多数业务场景。
一、建表时就该想好的索引设计
别等慢查询报警才加索引——那已经晚了。建表阶段就要结合主键、唯一性、高频查询条件做预判:
-
主键自动建聚簇索引:比如
CREATE TABLE user (id BIGINT PRIMARY KEY, name VARCHAR(50)),id列天然带高效索引,不用额外加 -
外键列建议手动加索引:如订单表
user_id是外键,且常用于JOIN或WHERE user_id = ?,就该立刻建:CREATE INDEX idx_order_user_id ON orders(user_id); -
组合索引注意最左前缀原则:如果经常查
WHERE status = 'paid' AND created_at > '2024-01-01',建INDEX idx_status_created ON orders(status, created_at);但反过来查created_at单独条件就用不上这个索引
二、给已有表安全加索引(生产环境必看)
线上加索引可能锁表、拖慢写入,尤其大表。不同数据库策略不同:
-
MySQL 5.6+:默认支持
ALGORITHM=INPLACE,不锁表(但仍有短暂元数据锁),推荐显式写法:ALTER TABLE logs ADD INDEX idx_log_type_time (log_type, create_time) ALGORITHM=INPLACE, LOCK=NONE; -
PostgreSQL:直接用
CONCURRENTLY,完全不阻塞读写:CREATE INDEX CONCURRENTLY idx_user_email ON users(email);(注意:不能在事务块中执行) -
小提醒:加索引前先
EXPLAIN确认原查询是否真走全表扫描;加完再EXPLAIN ANALYZE验证效果
三、哪些情况索引会“失效”?避坑清单
建了索引却没用上?多半掉进这些坑里:
标签: mysql go ai 邮箱 隐式类型转换 2025
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~