Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel和MySQL理解索引和复合/复合索引_Mysql_Laravel_Database Migration - Fatal编程技术网

Laravel和MySQL理解索引和复合/复合索引

Laravel和MySQL理解索引和复合/复合索引,mysql,laravel,database-migration,Mysql,Laravel,Database Migration,在Laravel(v6.8)中,我为用户表创建了以下迁移 用户迁移 解释 我知道index的基本知识及其工作原理,但对单个列和组合/复合索引的了解不太清楚 应用程序可能只通过用户名或电子邮件进行查询,或者我可能同时对这两个表进行查询。因此,正如您在我的迁移代码中所看到的,我已经使用创建复合索引的为每一列以及两列设置了索引 问题: 我想知道我是否正确设置了所有的索引,或者按照我的方式设置是个坏主意 如果不正确,我可以知道正确的方法吗? 谢谢你的帮助 好的,试着用各种方式设置unique和index

在Laravel(v6.8)中,我为
用户
表创建了以下迁移

用户迁移 解释 我知道
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');
        }
    );
}