加索引必须匹配查询实际使用方式:where、join、order by、group by字段(如user_id、status、created_at)需建索引;外键和softdeletes字段须手动加索引;联合索引按最左匹配原则设计顺序;字符串字段须指定前缀长度;必须用explain验证生效。

index() 是加普通索引最直接的方式,但加不加、怎么加、加在哪,得看查询实际怎么跑——不是所有字段加了索引就变快,加错反而拖慢写入、浪费空间。
WHERE 条件里的字段没加索引,基本等于裸奔
常见错误现象:SELECT * FROM orders WHERE user_id = 123 执行要 2 秒,EXPLAIN 显示 type: ALL(全表扫描);或者分页查 WHERE status = 'shipped' ORDER BY created_at DESC 卡顿,却只给 status 加了单列索引。
- 真正该加索引的字段:出现在
WHERE、JOIN ON、ORDER BY、GROUP BY中的列,比如user_id、status、created_at - 外键字段(如
user_id)几乎必须加索引 ——foreignId()不会自动加,得手动补->index() - 软删除字段(
deleted_at)如果常用于筛选(如whereNull('deleted_at')),也建议加索引 - 用
php artisan make:migration add_index_to_orders_user_id --table=orders创建迁移,然后在up()中写:$table->index('user_id');
复合索引字段顺序错了,索引就废了一半
常见错误现象:建了 ['status', 'created_at'] 索引,但查询是 WHERE created_at > '2025-01-01' AND status = 'paid',EXPLAIN 显示没走索引;或者 ORDER BY created_at DESC 没生效,还是 Using filesort。
- 联合索引遵循最左匹配原则:查询条件必须从左到右连续命中,才能充分利用索引
- 高频等值查询字段放前面(如
user_id),范围查询或排序字段放后面(如created_at) - 正确示例:
$table->index(['user_id', 'created_at'], 'orders_user_created_idx')→ 支持WHERE user_id = ?、WHERE user_id = ? ORDER BY created_at - 错误示例:
$table->index(['created_at', 'user_id'])→WHERE user_id = ?基本不走索引
字符串字段不控前缀长度,MySQL 直接静默失效
常见错误现象:本地开发加了 $table->string('description')->index(),上线后 EXPLAIN 发现没用上;或者迁移报错 Specified key was too long。
- Laravel 9+ 默认字符集是
utf8mb4,VARCHAR(255)实际最多占 1020 字节,而 MySQL InnoDB 单索引默认上限是 767 字节(老版本)或 3072 字节(5.7+ 启用innodb_large_prefix) - 必须显式控制前缀长度:
$table->string('description', 500)->index()->length(191) - 索引名建议显式指定:
$table->index('email', 'users_email_idx'),否则 Laravel 自动生成的名字(如users_em...)后期难维护
unique() 和 index() 别混着用,语义和效果完全不同
很多人加了 index() 就以为“已经去重了”,结果上线后发现订单号重复生成。
-
unique()本质是带约束的索引,它强制数据库拒绝重复写入;而index()只加速查询,不阻止重复 - 邮箱唯一性校验,应该用
$table->string('email')->unique()→ 正确:强制唯一 + 自动建唯一索引 -
$table->string('email')->index()→ 错误:不阻止重复,且索引类型是普通索引,无法替代唯一约束 - 想同时满足查询快 + 唯一,不用额外操作:
unique()自带索引效果,无需再写index()
加索引不是写完迁移就完事,关键得验证是否真被用上。线上慢查没解决,大概率是索引没命中、顺序错了,或者字段本身不适合建索引。别跳过 EXPLAIN 这一步,尤其在涉及分页、多条件、软删除的场景里,最容易忽略 deleted_at 和复合顺序的配合。











