【发布时间】:2020-12-07 20:32:33
【问题描述】:
为什么 Laravel 会自动为这种情况添加一个“INDEX”?
$table->foreignId('user_id')->nullable()
->constrained('users','id')
->onDelete('no action')
->onUpdate('no action');
【问题讨论】:
标签: php mysql sql laravel indexing
为什么 Laravel 会自动为这种情况添加一个“INDEX”?
$table->foreignId('user_id')->nullable()
->constrained('users','id')
->onDelete('no action')
->onUpdate('no action');
【问题讨论】:
标签: php mysql sql laravel indexing
来自https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html
MySQL 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为第一列。 如果引用表不存在,则会自动在其上创建此类索引。 如果您创建另一个可用于强制外键约束的索引,则稍后可能会静默删除此索引。 index_name,如果给定,则如前所述使用。
【讨论】:
Laravel 只添加外键约束,并没有隐式添加 index。但是有些数据库比如 MySQL 会自动index外键列。
当您在数据库表中定义外键约束时,索引将不会在上自动创建 >外键列,如在PRIMARY KEY约束情况下,集群索引将自动创建定义它的时候。 强烈建议在外键列上创建索引,以增强主外键连接的性能,同时降低维护关系的成本 child 和 parent 表之间。在添加任何新索引之前,最好先在开发环境中进行测试,并在实施后监控整体性能,以确保添加的索引能够提高性能并且不会对系统性能产生负面影响。
【讨论】: