Mysql 索引和键
Mysql index and key
我对 MySQL 和数据库还很陌生。昨天我遇到了这个 How to store multiple options in a single table?。我有几个与此相关的问题如下:
key(studentId,courseId)是什么,参数是什么。还有如何在 PhpMyAdmin 中执行此操作。
PhpMyAdmin 中的索引按钮是什么(查询代码为ADD INDEX
)。
如果我想使一个列成为外键,它可能在子 table 中具有冗余值,我该怎么做?现在我对该列进行了索引,而不是使其唯一。它是正确的还是有更好的方法来做到这一点?
1) "key" 适用于它是 "the most important thing",并且始终是唯一的。由于这个原因,"Primary" 通常用作唯一标识符。
2) 索引适用于以后检索记录的速度。就像在书的后面有一个清单。
3) 外键只是对位于不同 table 中的主键的引用。更容易弄清楚如何加入事物。
我在 link 中的回答显示了以下三个键(它们是索引)。 KEY 和 INDEX 是同义词。
那里有手册页 link 和其他 link。至于 SCJunction table 中的键(忽略主键),它们是
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (studentId,courseId),
key (courseId,studentId),
这就是它们的重要性。首先,刚才显示的所有 3 个都是复合索引。 #2 和 #3 的顺序颠倒了,因此根据查询数据的范围,db 引擎可以选择 哪个索引用于最快的检索基于最左边 您要访问的列。
我将在下面详细说明 最左 的概念。
至于唯一键#1,它旁边的注释说明不强制重复(意思是垃圾数据)是不言自明的。例如,学生 1 课程 1 学期 1 不能在 table.
中存在两次
确实可以通过将这些索引减少为以下两个来针对所有用户及其吞吐量简化这些索引:
刚好 2
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (courseId,studentId),
这三个是为了说明目的,当我试图增加那边答案的深度时,你暴露了一个额外的 KEY (INDEX) 不是必需的事实。因为 UNIQUE 键(反之)会满足三个条件。希望下面显示的示例可以使这一点更加清晰。
两个示例查询,说明复合索引,以及为什么有两个
Kim 这个学期上了多少门课(学期=100)
select count(*) as courseCount
from SCJunction
where studentId=2 and term=100
+-------------+
| courseCount |
+-------------+
| 3 |
+-------------+
答案可能是 2,因为我们在那个例子中删除了 Kim 的课程(在另一个 question/answer link)
有多少学生正在学习乔叟 class(courseId= 5,学期=100)?
select count(*) as studentCount
from SCJunction
where courseId=5 and term=100
+--------------+
| studentCount |
+--------------+
| 2 |
+--------------+
上面的两个查询将受益于索引,但不是同一个索引。这是因为 where 子句是根据不同的条件进行搜索的。两个不同索引中 left-most 列的条件。最左边的意思是,对于复合索引,从左到右(就像您用英语阅读它的方式),这是一个可以使我的搜索受益的索引。如果不是,则不使用。如果使用 none,您将在不使用索引的情况下对所有数据进行可怕的 table 扫描。
复合索引的使用可能是部分,这样只有一定数量的列(从最左边开始)对数据库引擎有用。但至少索引用于获取该数据子集。
您需要了解 SQL 的基础知识。
键,键的类型很多,有主键唯一标识数据库中的每条记录table注意键可能存在于多个字段上。还有 外键 定义了与另一个 table 的关系。
索引是一种特殊的数据库结构,可以加快数据检索速度。有很多索引类型。您可以阅读更多相关信息 here
@durbnpoisn 解释了 3 个问题
我对 MySQL 和数据库还很陌生。昨天我遇到了这个 How to store multiple options in a single table?。我有几个与此相关的问题如下:
key(studentId,courseId)是什么,参数是什么。还有如何在 PhpMyAdmin 中执行此操作。
PhpMyAdmin 中的索引按钮是什么(查询代码为
ADD INDEX
)。如果我想使一个列成为外键,它可能在子 table 中具有冗余值,我该怎么做?现在我对该列进行了索引,而不是使其唯一。它是正确的还是有更好的方法来做到这一点?
1) "key" 适用于它是 "the most important thing",并且始终是唯一的。由于这个原因,"Primary" 通常用作唯一标识符。
2) 索引适用于以后检索记录的速度。就像在书的后面有一个清单。
3) 外键只是对位于不同 table 中的主键的引用。更容易弄清楚如何加入事物。
我在 link 中的回答显示了以下三个键(它们是索引)。 KEY 和 INDEX 是同义词。
那里有手册页 link 和其他 link。至于 SCJunction table 中的键(忽略主键),它们是
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (studentId,courseId),
key (courseId,studentId),
这就是它们的重要性。首先,刚才显示的所有 3 个都是复合索引。 #2 和 #3 的顺序颠倒了,因此根据查询数据的范围,db 引擎可以选择 哪个索引用于最快的检索基于最左边 您要访问的列。
我将在下面详细说明 最左 的概念。
至于唯一键#1,它旁边的注释说明不强制重复(意思是垃圾数据)是不言自明的。例如,学生 1 课程 1 学期 1 不能在 table.
中存在两次确实可以通过将这些索引减少为以下两个来针对所有用户及其吞吐量简化这些索引:
刚好 2
unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
key (courseId,studentId),
这三个是为了说明目的,当我试图增加那边答案的深度时,你暴露了一个额外的 KEY (INDEX) 不是必需的事实。因为 UNIQUE 键(反之)会满足三个条件。希望下面显示的示例可以使这一点更加清晰。
两个示例查询,说明复合索引,以及为什么有两个
Kim 这个学期上了多少门课(学期=100)
select count(*) as courseCount
from SCJunction
where studentId=2 and term=100
+-------------+
| courseCount |
+-------------+
| 3 |
+-------------+
答案可能是 2,因为我们在那个例子中删除了 Kim 的课程(在另一个 question/answer link)
有多少学生正在学习乔叟 class(courseId= 5,学期=100)?
select count(*) as studentCount
from SCJunction
where courseId=5 and term=100
+--------------+
| studentCount |
+--------------+
| 2 |
+--------------+
上面的两个查询将受益于索引,但不是同一个索引。这是因为 where 子句是根据不同的条件进行搜索的。两个不同索引中 left-most 列的条件。最左边的意思是,对于复合索引,从左到右(就像您用英语阅读它的方式),这是一个可以使我的搜索受益的索引。如果不是,则不使用。如果使用 none,您将在不使用索引的情况下对所有数据进行可怕的 table 扫描。
复合索引的使用可能是部分,这样只有一定数量的列(从最左边开始)对数据库引擎有用。但至少索引用于获取该数据子集。
您需要了解 SQL 的基础知识。
键,键的类型很多,有主键唯一标识数据库中的每条记录table注意键可能存在于多个字段上。还有 外键 定义了与另一个 table 的关系。
索引是一种特殊的数据库结构,可以加快数据检索速度。有很多索引类型。您可以阅读更多相关信息 here
@durbnpoisn 解释了 3 个问题