Laravel和MySQL理解索引和复合/复合索引
在Laravel(v6.8)中,我为Laravel和MySQL理解索引和复合/复合索引,mysql,laravel,database-migration,Mysql,Laravel,Database Migration,在Laravel(v6.8)中,我为用户表创建了以下迁移 用户迁移 解释 我知道index的基本知识及其工作原理,但对单个列和组合/复合索引的了解不太清楚 应用程序可能只通过用户名或电子邮件进行查询,或者我可能同时对这两个表进行查询。因此,正如您在我的迁移代码中所看到的,我已经使用创建复合索引的为每一列以及两列设置了索引 问题: 我想知道我是否正确设置了所有的索引,或者按照我的方式设置是个坏主意 如果不正确,我可以知道正确的方法吗? 谢谢你的帮助 好的,试着用各种方式设置unique和index
用户
表创建了以下迁移
用户迁移
解释
我知道index
的基本知识及其工作原理,但对单个列和组合/复合索引的了解不太清楚
应用程序可能只通过用户名
或电子邮件
进行查询,或者我可能同时对这两个表进行查询。因此,正如您在我的迁移代码中所看到的,我已经使用创建复合索引的为每一列以及两列设置了索引
问题:
我想知道我是否正确设置了所有的索引
,或者按照我的方式设置是个坏主意
如果不正确,我可以知道正确的方法吗?
谢谢你的帮助
好的,试着用各种方式设置unique
和index
来解释EXPLAIN
查询,最后,我找到了最终版本,如下所示
public function up()
{
Schema::create(
'users',
function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password')->nullable();
$table->enum('role', ['super', 'admin', 'manager', 'subscriber', 'user'])->default('user');
$table->boolean('is_root')->default(FALSE);
$table->rememberToken();
$table->timestamps();
$table->unique(['username', 'email'], 'users_unique_credentials');
}
);
}
这样,当我们查询单个列时,它将使用自己的唯一索引。当我们使用多个WHERE
子句搜索两列时,它将使用复合唯一的索引。我假设用户名
和电子邮件
是单独唯一的。而不是用户名
,电子邮件
对是单独唯一的。因此,每个都应该是唯一的。似乎将其指定为索引是多余的,因为MySQL将创建一个unque索引来强制执行唯一性(对此不太确定-不太了解Laravel-让它创建重复索引是浪费)。自从收到任何回复后,我开始测试自己,我意识到与您所说的相同。创建一个unique
键MySQL
会为它创建一个索引。因此,在这种情况下,无需创建单独的索引。
现在我脑海中的问题是,我应该创建一个复合unique
还是一个单独的列,因为我必须同时检查唯一性还是单独的唯一性。据我所知,我需要申请个人和化合物。但是需要专家的指导,不太需要复合指数。如果同时搜索这两个索引,mysql将查看其中一个索引,如果找到记录,第二个值可以很快得到验证。如果查询的唯一部分是存在对,则速度会(不明显地)变慢,任何附加的查询条件或获取的字段(如is_root
)将导致完全相同的查询时间。感谢您的参与,以做出这个答案。@danblack非常感谢您的输入。对不起,回答时没有提到你的帮助。我会更新的。
public function up()
{
Schema::create(
'users',
function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password')->nullable();
$table->enum('role', ['super', 'admin', 'manager', 'subscriber', 'user'])->default('user');
$table->boolean('is_root')->default(FALSE);
$table->rememberToken();
$table->timestamps();
$table->unique(['username', 'email'], 'users_unique_credentials');
}
);
}