Laravel 的多态关系性能
Laravel's polymorphic relationships performance
有没有人对 Laravel 中的多态关系的性能有任何经验?我需要为几个不同的模型设置 tables,多态关系在这里会很好,我想知道性能,是否和每个模型都有自己的设置 table 一样好?
设置 table 很简单,这就是设置 table 的样子:
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('key');
$table->string('value')->nullable();
我会削减每个模型设置所需的几个 tables,只是想知道使用多态设置是否会出现性能问题?
如果我决定使用多态,那么我会将这些类型添加到 table:
$table->string('has_settings_type');
$table->biginteger('has_settings_id')->unsigned();
这就是 laravel 添加对多态关系的支持所需要的。
只要您将正确的索引添加到 table,性能就不会成为多态关系的问题。
但是,您的 table 缺少一个使其成为多态的字段,您需要与该设置相关的模型名称。
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('foreign_object'); // Object name (e.g.: 'App\User')
$table->string('key');
$table->string('value')->nullable();
$table->index(['foreign_id', 'foreign_object']); // To get all settings for an object
$table->index(['foreign_id', 'foreign_object', 'key']); // To get single key for an object
如果您使用的少于 5.2.34
,则不会预先加载超过多态关系的关系。您可以阅读有关此问题的更多信息 here。一个例子是,如果 images
是多态的而你做了:
->with('product.images.sources');
sources
不会被预加载。
对 Jerodev 答案的改进。
索引顺序很重要。
通常你会想搜索这样的东西
get all settings for a given model (foreign_object)
如果你保持这样的索引顺序(foreign_id,foreign_object),那么sql将无法使用索引来执行上面的查询,因为最左边索引中的列不是 foreign_object
因此索引应该是这样的
$table->index(['foreign_object', 'foreign_id']);
$table->index(['foreign_object', 'foreign_id', 'key']);
有没有人对 Laravel 中的多态关系的性能有任何经验?我需要为几个不同的模型设置 tables,多态关系在这里会很好,我想知道性能,是否和每个模型都有自己的设置 table 一样好?
设置 table 很简单,这就是设置 table 的样子:
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('key');
$table->string('value')->nullable();
我会削减每个模型设置所需的几个 tables,只是想知道使用多态设置是否会出现性能问题?
如果我决定使用多态,那么我会将这些类型添加到 table:
$table->string('has_settings_type');
$table->biginteger('has_settings_id')->unsigned();
这就是 laravel 添加对多态关系的支持所需要的。
只要您将正确的索引添加到 table,性能就不会成为多态关系的问题。
但是,您的 table 缺少一个使其成为多态的字段,您需要与该设置相关的模型名称。
$table->increments('id');
$table->integer('foreign_id')->unsigned();
$table->string('foreign_object'); // Object name (e.g.: 'App\User')
$table->string('key');
$table->string('value')->nullable();
$table->index(['foreign_id', 'foreign_object']); // To get all settings for an object
$table->index(['foreign_id', 'foreign_object', 'key']); // To get single key for an object
如果您使用的少于 5.2.34
,则不会预先加载超过多态关系的关系。您可以阅读有关此问题的更多信息 here。一个例子是,如果 images
是多态的而你做了:
->with('product.images.sources');
sources
不会被预加载。
对 Jerodev 答案的改进。 索引顺序很重要。
通常你会想搜索这样的东西
get all settings for a given model (foreign_object)
如果你保持这样的索引顺序(foreign_id,foreign_object),那么sql将无法使用索引来执行上面的查询,因为最左边索引中的列不是 foreign_object
因此索引应该是这样的
$table->index(['foreign_object', 'foreign_id']);
$table->index(['foreign_object', 'foreign_id', 'key']);